将结构数组传递给函数

时间:2012-09-22 08:06:47

标签: c

如何将结构从一个函数传递到另一个函数?

typedef char word_t[MAX_WORD_LEN+1];

typedef struct {
    int nwrds;
    word_t words[MAX_PARA_LEN];
} para_t;

int
main() {
    para_t onepara;
    while (get_paragraph(onepara, MAX_PARA_LEN) != EOF) {
        put_paragraph(onepara, MAX_SNIPPET_LEN);
    }
    end_output();
    return 0;
}

int
get_paragraph(para_t p, int limit) {
    int d, i;
    word_t w;
    for (i=0;i<limit;i++) {
        if ((d=get_word(w, MAX_WORD_LEN))==EOF) {
            return EOF;
        } else if(d==WORD_FND) {
            strcpy(p.words[i], w);
        } else if (d==PARA_END) {
            new_paragraph();
            break;
        }
    }
    return PARA_FND;
}

void
put_paragraph(para_t p, int limit)  {
    int i;
    for (i=0;i<limit; i++)  {
    printf("%s\n", p.words[i]);
    }
}

我已经使用strcpy将单词'w'复制到结构'p'中的数组(在get_paragraph中),但是当我打印出该结构时,我无法获得任何输出。 目前put_paragraph没有输出字符串,但我无法弄清楚原因。

get_paragraph中的get_word函数可以正确识别单词,但我没有将其包含在内以节省空间。

3 个答案:

答案 0 :(得分:2)

如果希望函数以调用者可见的方式修改它,则需要将指针传递给para_t

C中的所有内容都由 value 传递,因此您的结构副本将传递给get_paragraph函数,并且只修改副本。如果希望函数修改参数,则需要传递指针。

typedef struct {
    char p[10];
} foo;

void bar(foo *f) {
    strcpy(f->p, "hello");
}

int main() {
    foo f = {0};
    bar(&f);
    printf("%s", f.p);  // prints "hello"
}

由于所有内容都是按值传递的,如果words是一个指针而不是一个数组,这就行了(虽然我仍会传递一个指针,不需要在这里复制)。

指针已被复制,但指针的是一个内存地址,因此本来应该保留在副本中,并且与原始words相同的内存块提到的变量会被修改。

typedef struct {
    char *p;
} foo;

void bar(foo f) {
    strcpy(f.p, "hello");
}

int main() {
    foo f = {0};
    f.p = malloc(10);
    bar(f);
    printf("%s", f.p);  // prints "hello"
}

旁注......

接下来,如果函数需要为参数本身分配一个全新的值,则必须使用另一个级别的间接,即指向指针的指针。

答案 1 :(得分:1)

while (get_paragraph(onepara, MAX_PARA_LEN) != EOF) {
        put_paragraph(onepara, MAX_SNIPPET_LEN);
    }

在您的代码中,您已通过 value 传递结构变量onepara,并且当您通过 value 传递变量时,只传递变量的副本将由函数访问而不是实际值 - 因此您对变量所做的任何修改都将对副本进行修改,并且不会反映在调用函数的变量中。

在您的情况下,您已按值onepara传递,但为了使您的代码按预期工作,您需要在调用onepara和{{1}时传递get_paragraph的地址}}。

函数声明应该类似于

put_paragraph

在调用上述函数时,您需要传递int get_paragraph(para_t *p, int limit) void put_paragraph(para_t *p, int limit)

的地址
one_para

在函数while (get_paragraph(&onepara, MAX_PARA_LEN) != EOF) { put_paragraph(&onepara, MAX_SNIPPET_LEN); get_paragraph中,您需要put_paragraph运算符而不是->运算符访问结构的成员,如下所示:

.(而不是p->words[i]

例如,您将p.words[i] as,

strcpy

答案 2 :(得分:0)

你可以传递它(并返回):

#include <stdio.h>

typedef struct
{
  int x;
  const char* str;
} T;

T fxn(T t)
{
  t.x++;
  t.str++;
  return t;
}

int main(void)
{
  T t1 = { 1, "XYZ" };
  T t2;
  printf("t1: %d, %s\n", t1.x, t1.str);
  t2 = fxn(t1);
  printf("t1: %d, %s\n", t1.x, t1.str);
  printf("t2: %d, %s\n", t2.x, t2.str);
  return 0;
}

输出(ideone):

t1: 1, XYZ
t1: 1, XYZ
t2: 2, YZ

上面的示例显示了如何通过值传递(并返回)结构。正如您所见,fxn()会获得传递给它的内容的副本。因此,如果要修改传递的结构,则必须返回上面示例中的新结构,或者通过引用传递结构

#include <stdio.h>

typedef struct
{
  int x;
  const char* str;
} T;

void fxn2(T* t)
{
  t->x++;
  t->str++;
}

int main(void)
{
  T t1 = { 1, "XYZ" };
  printf("t1: %d, %s\n", t1.x, t1.str);
  fxn2(&t1);
  printf("t1: %d, %s\n", t1.x, t1.str);
  return 0;
}

输出(ideone):

t1: 1, XYZ
t1: 2, YZ