64,282
社区成员
发帖
与我相关
我的任务
分享
void main()
{
for (int i = 0 ; i < 10 ; i++)
{
int k;
// k++;
printf("%x\n",&k);
if (i == 0)
{
// k = 0;
k++;
}
else
{
k++;
}
printf("%d %x \n",k,&k);
}
getchar();
}
第一个问题:你说:把k++打开,运行出错,原因是K没有初始化 这个是没有问题的。一个垃圾值(未初始化的局部变量),你读它根本没问题,输出他的地址也OK,只不过程序没意义。 一个局部变量一旦定义,在他的生存期内,他 的地址是不会变的。所以k地址不会变。 栈变量是系统分配的内存,你无法干预和改变。 问题是,k未初始化,他的值是垃圾值。你无法预测。所以你加加减减,输出什么的,都会看到是垃圾值。 还有,不要不定义放到循环里面,这样没错,但是不好。一个变量定义一次了,你使用完了又把它定义一遍,没理由这样做。 你可以放在for( int k ; ; ) 这里,或者for外面。
与printf无关,是因为vc调试器会插入调试代码(检查变量是否已经初始化),导致k++的时候报错。用release就没有问题。 局部变量的周期就是一个作用域内,在本例中,就是一次for循环,也就是每次for循环,否有一个新的k产生。之所以新生成的局部变量还会每次累加,是因为局部变量的分配地址的问题。编译器很有可能将新生成的局部变量放置在同一个内存地址,所以新的一个循环中的k与上一次循环中的k,从语义上来说已经是不同的了,但是从实现上来说,却分配了同一个地址。所以多次循环操作的是同一个地址中的值,也就会出现可以累加的情况了。