C - 循环中声明的变量在每次循环执行时是否在同一位置获取内存?

时间:2017-05-06 23:32:42

标签: c memory

请阅读以下代码。

#include <stdio.h>
int main(void) 
{
    char* a[4];
    int i=0;
    while(i<3)
    {
      char b[50];
      scanf(" %s",b);//Assume user enters one two three 
      a[i++]=b;
    }
    i=0;
    while(i<3)
    printf(" %s ",a[i++]);//Why does it always print three three three
return 0;
}

澄清以下内容:

  1. 是否每次在内存中分配相同的50个字节,以便数组a的所有元素都指向相同的50个字节,因此我们只打印三次(即最后输入的内容) )

  2. 因为在完成while之后,阵列b可以很好地移除但是没有它每次只打印三次。为什么呢?

  3. 这个代码只打印三个,当它打印一个二三,一三三时,这完全不是巧合。怎么了?

  4. 我知道这个问题非常错误。请原谅我。我是新来的。

1 个答案:

答案 0 :(得分:3)

问题#1:

  • 变量touchEnd是一个严格本地的变量 while循环。
  • 因此,不要通过指针引用以前由b在while循环之外(之后)使用的任何内存。
  • b的存储空间将重新分配3次。
  • 在while循环结束时,b将超出范围。
问题#2:
  • 在while循环之后,b不再是有效指针 因为a被指定为指向a, 并且while循环后b超出了范围。
  • 永不,分配给b的内存可能仍然存在 没有被修改过。由于b仅基于a分配,因此您无法预测解除引用a之后取消引用的价值。

问题#3:

  • (请参阅#2)在while循环之后使用陈旧指针解除引用b的代码 - 我不会依赖于输出。