c - C中声明的与未声明的数组

标签 c variable-length-array

我遇到了这两个代码块:

#include <stdio.h>
int main() {
  int a[10], i;
  for (i = 1; i <= 10; i++) {
    scanf("%d", &a[i]);
    printf("%d\n", a[i]);
  }
  return 0
}

当我运行第一段代码时,代码运行良好,但在某些时候它被覆盖了,我没有得到预期的结果。

但是,当我运行第二段代码时,程序运行得非常好,没有错误。

#include <stdio.h>
int main() {
  int size;
  scanf("%d", &size);
  int a[size], i;
  for (i = 1; i <= size; i++) {
    scanf("%d", &a[i]);
    printf("%d\n", a[i]);
  }
  return 0
}

为什么第二种情况程序运行完美?即使在第二种情况下,下标也会超过声明的数组大小。

最佳答案

两个代码片段都有数组越界访问,所以你会看到未定义的行为

for(i=1;i<=size;i++)

如果您的数组大小为 10,则有效索引为 0-9

一旦我们说出未定义的行为,那么任何事情都可能发生,甚至是崩溃。当你说它正在工作时,那只是幸运,你可能没有看到崩溃,但你仍然在访问一些你没有分配的内存

关于c - C中声明的与未声明的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27757562/

相关文章:

c - 缓冲区溢出

python - 在 Numpy C 扩展中返回可变长度数组?

c - 变量二维数组访问时打印 "subscript of pointer to incomplete type"

c - 符号表中函数的 "size"到底是什么?

c - 无法连接到 gpsd

c++ - C++中是否有可变长度数组?

c - 仅在使用 clang 10 编译时出现 strsep 之后的段错误

c - 变长数组指令是如何生成的?

c++ - 是否有必要学习 Java 来为开源项目做贡献?

c - 可以给彼此分配不同类型的指针吗?