当您将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); }