考虑一下代码
#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;
}打印我为itera输入的值。
但是当我通过un-注释//doexp( iter = 1 );将1重新分配到iter时
它打印垃圾的价值为伊特拉;
在声明doexp( printf("%i i = %i\n",iter[a],iter) );。
我尝试了aiter而不是aiter,但是得到了同样的结果。
使用gcc版本4.7.2 (Debian 4.7.2-5)
为什么会发生这种事?
发布于 2014-03-23 17:40:55
doexp(scanf...在iter为10时被“调用”(printarr生成iter=10)。因此,您正在将该值读入数组之外的a10中。它已经是未定义的行为,您只是幸运您的程序没有崩溃在这一点。
打印出a[1]将给您一个垃圾值,因为该项目尚未初始化。
https://stackoverflow.com/questions/22594444
复制相似问题