将结构数组传递给函数

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

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函数可以正确识别单词,但我没有将其包含在内以节省空间。

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

C中的所有内容都是按传递的,因此您的结构副本将传递给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", fp); // prints "hello" } 

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

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

 typedef struct { char *p; } foo; void bar(foo f) { strcpy(fp, "hello"); } int main() { foo f = {0}; fp = malloc(10); bar(f); printf("%s", fp); // prints "hello" } 

旁注…

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

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

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

在您的情况下,您已经按值传递了一个,但是为了使您的代码按预期工作,您需要在调用get_paragraphput_paragraph时传递onepara的地址。

函数声明应该看起来像,

 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_paragraphput_paragraph ,您需要通过->运算符而不是.来访问结构的成员. 运营商如下:

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

例如,你会做strcpy

 strcpy(p->words[i], w) 

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

 #include  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  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