如何将结构从一个函数传递到另一个函数?
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函数可以正确识别单词,但我没有将其包含在内以节省空间。
答案 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