我是 C 新手,对通过指针引用结构成员时得到的结果感到困惑。请参阅以下代码示例。当我第一次引用 tst->number 时发生了什么?我在这里缺少什么基本的东西?
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int number;
} Test;
Test* Test_New(Test t,int number) {
t.number = number;
return &t;
}
int main(int argc, char** argv) {
Test test;
Test *tst = Test_New(test,10);
printf("Test.number = %d\n",tst->number);
printf("Test.number = %d\n",tst->number);
printf("Test.number = %d\n",tst->number);
}
输出是:
Test.number = 10
Test.number = 4206602
Test.number = 4206602
当您将 test 传递到 Test_New 函数时,您将按值传递它,因此会在堆栈上为 Test_New 函数的函数范围创建本地副本。由于您返回变量的地址,因此一旦函数返回,堆栈就没用了,但您返回了指向旧堆栈上的结构的指针!因此,您可以看到您的第一次调用返回了正确的值,因为没有任何内容覆盖您的堆栈值,但后续调用(全部使用堆栈)会覆盖您的值并给出错误的结果。
要正确执行此操作,请重写 Test_New 函数以获取指针并将指向结构的指针传递到函数中。
Test* Test_New(Test * t,int number) {
t->number = number;
return t;
}
int main(int argc, char ** argv) {
Test test;
Test * tst = Test_New(&test,10);
printf("Test.number = %d\n",tst->number);
printf("Test.number = %d\n",tst->number);
printf("Test.number = %d\n",tst->number);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)