C - int_[arr] 的行为,当int_被重新分配给它的当前值时

  • 本文关键字:int 分配 新分配 arr printf
  • 更新时间 :
  • 英文 :


考虑以下代码

#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 );

将1重新分配给iter时

它打印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]会给你一个垃圾值,因为项目还没有初始化。

最新更新