【问题标题】:C Return Struct Pointer after Function Call Value Gets Lost函数调用值丢失后C返回结构指针
【发布时间】:2016-12-05 02:39:24
【问题描述】:

我试图弄清楚为什么函数返回后我的结构值丢失了。

struct A {
   int val1;
   int val2;
}

main() {
   struct A *a;
   a->val1 = 1;
   a->val2 = 2;
   calc((void*)a);
   // calc returns and a's values are 1 and 2 respectively
}

void calc(void* v) {
     struct A *a = (struct A*) v;
     ...
     a->val1 = 2;
     a->val2 = 3;
}

【问题讨论】:

  • main: struct A *a; a->val1 = 1; 你认为a 指向哪里?除非指针指向有效内存,否则不得取消引用。
  • a 应该是堆栈中的地址(如果我错了请纠正我)。我尝试为a 分配空间,但仍然得到相同的结果。
  • 为什么定义main() 来返回struct A?您缺少一个关键分号!
  • @Celeste 为什么a 应该是堆栈上的地址?您在哪里分配a 一个作为堆栈地址的值?当然,a 本身是堆栈上的一个位置,但 a 本身是一个指针。你需要一个实际的A,而不仅仅是指向一个的指针。

标签: c struct


【解决方案1】:

当你要处理指针时,你必须引入动态内存分配。创建指针意味着您告诉编译器“我将在其中存储变量的地址”。所以在这种情况下,要么你创建一个对象给它分配地址,要么给它动态分配内存。

案例一:

main() {
   struct A *a;
   struct A obj;//assign address of other object manually
   a = &obj;
   a->val1 = 1;
   a->val2 = 2;
   calc((void*)a);
   // calc returns and a's values are 1 and 2 respectively
}

案例 2:

main() {
   struct A *a;
   a = (A *) malloc(sizeof(A));//dynamic memory allocation
   a->val1 = 1;
   a->val2 = 2;
   calc((void*)a);
   // calc returns and a's values are 1 and 2 respectively
}

【讨论】:

  • 我对地址和指针感到困惑。它现在正在工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2011-04-19
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多