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

标签 c printf

考虑代码

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

将 1 重新分配给 iter 时

它为 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/

相关文章:

c - 如何保存到文件?

c -\n 如何影响 scanf 中的字符串扫描?

c - 当我尝试打开 fifo O_WRONLY 时,出现 "No such device or address"错误

Clang 错误 - 找不到 stddef 文件?

c - 在单独的行中打印每个单词

复制用户的输入并将其显示在屏幕上

c - 为什么两个整数相除返回 0.00?

c++ - 如何将此代码转换为 C++?

c - 如何使opengl文本可见/改变颜色?

c - 在链中只找到 1x 重复元素?