考虑代码
#include<stdio.h>
#define printarr(a,len) iter = 0;while( iter < len )printf("%i ",*(a + iter++));printf("\n");
#define print(a) printf("%s\n",#a);
#define doexp(a); printf("%s:",#a);a;if( strstr(#a,"scanf") == NULL )printf("\n");
int main()
{
int a[10],b[10] = {},iter = 1;
printarr(a,10);
printarr(b,10);
scanf("%i",&iter[a]);
iter = 1;
printf("%i i = %i\n",iter[a],iter);
if( &iter[a] == &a[iter] )
{
printf("true\n");
if( iter[a] == a[iter] )
{
printf("true!!\n");
}
}
return 0;
}
打印我为 iter[a] 输入的值。
但是当我通过取消注释 //doexp( iter = 1 );
它为 iter[a] 的值打印垃圾;
在声明 doexp( printf("%i i = %i\n",iter[a],iter) );
。
我尝试了 [iter] 而不是 [iter],但得到了相同的结果。;
使用 gcc 版本 4.7.2 (Debian 4.7.2-5)
为什么会这样?
最佳答案
doexp(scanf...
在 iter
为 10 时被“调用”(printarr
使 iter=10)。所以你正在阅读值到数组外部的 a[10] 中。这已经是未定义的行为,你很幸运你的程序此时没有崩溃。
打印出 a[1]
无论如何都会给你一个垃圾值,因为该项目尚未初始化。
关于c - 当 int_ 被重新分配给它的当前值时 int_[arr] 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594444/