请阅读以下代码。
#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;
}
澄清以下内容:
是否每次在内存中分配相同的50个字节,以便数组a的所有元素都指向相同的50个字节,因此我们只打印三次(即最后输入的内容) )
因为在完成while之后,阵列b可以很好地移除但是没有它每次只打印三次。为什么呢?
这个代码只打印三个,当它打印一个二三,一三三时,这完全不是巧合。怎么了?
我知道这个问题非常错误。请原谅我。我是新来的。
答案 0 :(得分:3)
问题#1:
touchEnd
是一个严格本地的变量
while循环。
b
在while循环之外(之后)使用的任何内存。
b
的存储空间将重新分配3次。
b
将超出范围。
b
不再是有效指针
因为a
被指定为指向a
,
并且while循环后b
超出了范围。
b
的内存可能仍然存在
没有被修改过。由于b
仅基于a
分配,因此您无法预测解除引用a
之后取消引用的价值。
问题#3:
b
的代码 - 我不会依赖于输出。