对通过指针访问struct成员感到困惑

mar*_*pan 3 c pass-by-value

我是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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Test.number = 10
Test.number = 4206602
Test.number = 4206602
Run Code Online (Sandbox Code Playgroud)

Ron*_*lic 14

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

}
Run Code Online (Sandbox Code Playgroud)