我已经在这段代码上工作了几个小时,对于为什么printf只打印垃圾,我感到困惑,我是堆栈溢出的新手,而对于C来说还很陌生,所以请原谅我在本文中的任何错误。我研究了指向数组结构的指针,找不到任何有用的东西。
typedef struct my
{
int x;
int y;
} My;
My * main2(void);
void show(void)
{
My * m = main2();
printf("%u\n", m);
printf("%u\n", m);
printf("%d\n", m->x);
printf("%d\n", m->y);
m++;
printf("%u\n", m);
printf("%d\n", m->x);
printf("%d\n", m->y);
m++;
printf("%u\n", m);
printf("%d\n", m->x);
printf("%d\n", m->y);
}
My * main2(void)
{
My j[3];
j[0].x = 2;
j[0].y = 4;
j[1].x = 3;
j[1].y = 5;
j[2].x = 7;
j[2].y = 9;
printf("%u\n", j);
return j;
}
int main()
{
show();
return 0;
}
答案 0 :(得分:4)
在函数内部定义的变量仅具有该函数的生命周期。一旦函数返回,变量实际上就不复存在了。
现在,如果您返回指向此类变量的指针(或指向数组的第一个元素的指针),并且该数据不再存在,则在尝试使用指针时会得到undefined behavior。
解决此类问题的一种方法是将数组(或指向其第一个元素的指针)作为 argument 传递给函数:
void main2(My *j)
{
j[0].x = 2;
// And so on...
}
并要将数组传递给函数,请记住,在需要指针的上下文中使用数组时,数组会衰减指向其第一个元素的指针。
这意味着您可以像传递任何其他变量一样传递它:
My arr[3];
main2(arr); // equal to main2(&arr[0]);
另一方面,使用printf
打印指针的格式为"%p"
。指针也需要强制转换为void *
:
printf("%p\n", (void *) j);
答案 1 :(得分:2)
为什么printf只打印垃圾?这是因为您要在此处返回局部变量的地址
My j[3];
...
...
return j; /* j is a local array, its scope is within this this function not outside */
您的编译器可能已经警告过您
函数返回局部变量[-Werror = return-local-addr]的地址
要解决此问题,您可以创建动态数组并返回它。
另外,在打印m
的结构指针时,请使用%p
而不是%u
格式说明符。例如
printf("%p\n", (void*)m);
答案 2 :(得分:0)
好吧,我得到了答案,我真的忘记了这一点,非常重要,函数返回后,函数中的所有内容都“消失了”,谢谢两个帮助回答这个问题的人:)
typedef struct my
{
int x;
int y;
} My;
void getData(My * pos)
{
printf("%d", pos->x);
printf("%d", pos->y);
pos++;
printf("%d", pos->x);
printf("%d", pos->y);
}
int main()
{
My x[2];
x[0].x = 3;
x[0].y = 4;
x[1].x = 5;
x[1].y = 6;
getData(x);
return 0;
}