c - 结构变量用 printf 改变值

标签 c pointers struct

我有一个包含指向整数的指针数组的结构。第一个指针的值在对 printf 的调用之间发生变化。除非我通过函数生成结构,否则不会发生这种情况。代码如下。有人能告诉我发生了什么事吗?谢谢。

 struct a {

     int *nums[10];

 };

 struct a *makeS();


 int main(int argc, char *argv[]){

      struct a *_b = (struct a*) malloc(sizeof(struct a));

      struct a *_c = makeS();

      int i = 1;

      _b->nums[0] = &i;

      printf("Num is %d\n", *_b->nums[0]);  // prints 1
      printf("Num is %d\n", *_b->nums[0]);  // prints 1
      printf("Num is %d\n", *_b->nums[0]);  // prints 1
      printf("Num is %d\n", *_b->nums[0]);  // prints 1 … etc.


      printf("Num is %d\n", *_c->nums[0]);  // prints 1
      printf("Num is %d\n", *_c->nums[0]);  // prints 0
      printf("Num is %d\n", *_c->nums[0]);  // prints 0
      printf("Num is %d\n", *_c->nums[0]);  // prints 0 … etc.


  }

  struct a* makeS(){

      struct a *_s = (struct a*) malloc(sizeof(struct a));

      int i = 1;

      _s->nums[0] = &i;

      return _s;

 }

最佳答案

您的问题出在函数中:

  struct a* makeS(){

      struct a *_s = (struct a*) malloc(sizeof(struct a));

      int i = 1;

      _s->nums[0] = &i;

      return _s;

 }

int i 超出范围,因为它是局部变量,这意味着您正在使用悬空指针。

i 使用的内存可以自由地被其他东西使用,并且很可能被后续 printf 调用中使用的缓冲区或工作空间重新利用。

关于c - 结构变量用 printf 改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39539848/

相关文章:

c - 为什么这个 C 程序在 VC++2008 中返回正确的值?

c - 为什么 sizeof 在 C 中对同一个字符串返回不同的值?

c - 以下哪种 C 乘法算法更容易使用 CPU 并且开销更低?

C - 单词数组

C |指针|分段故障

c - 无法计算输出中的行数

c++ - 将_cast 重新解释为 void 是否合法*

C++ 传递对象的拷贝还是传递指向对象的指针?

以 vector 作为成员的结构的 C++ 大小

C 程序结构赋值无效八进制数字