考虑以下代码
#include<stdio.h>
#define printarr(a,len) iter = 0;while( iter < len )printf("%i ",*(a + iter++));printf("n");
#define print(a) printf("%sn",#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 = %in",iter[a],iter);
if( &iter[a] == &a[iter] )
{
printf("truen");
if( iter[a] == a[iter] )
{
printf("true!!n");
}
}
return 0;
}
打印我为iter[a]输入的值。
但是当我通过取消注释//doexp( iter = 1 );
它打印iter[a]值的垃圾;
在语句doexp( printf("%i i = %in",iter[a],iter) );
。
我尝试用[iter]代替[iter],但得到相同的结果。
使用gcc版本4.7.2 (Debian 4.7.2-5)
doexp(scanf...
在iter
=10时被'调用' (printarr
使iter=10)。所以你正在将值读入数组外的[10]。这已经是未定义的行为,你只是幸运的是你的程序在这一点上没有崩溃。
输出a[1]
会给你一个垃圾值,因为项目还没有初始化。