c - 如果数组仅使用列值定义,则当数组超出时没有错误,没有警告

标签 c arrays 2d

<分区>

guyz,今天我很困惑(好吧,至少对我来说是这样)。我被声明为一个数组,具有以下属性:

      int arr[0][1] = {1,2,3,4,5,6 ... };

在执行此操作时,我收到此警告:

    warning: excess elements in array initializer.

在打印这段代码时,我在每个索引中都得到了一些垃圾值。 之后,我尝试使用以下片段,

    int arr[][1] = {1,2,3,4,5,6,7,8,9};

奇怪的是,我没有收到警告也没有错误。当我执行以下代码时:

     #include <stdio.h>
    int main() {
   int t[][1] = {1,2,3,4,5,6,7,8,9};
        for(int i=0; i<9; i++){
         for(int j=0; j<9; j++)
            printf("%i ",t[i][j]);
         printf("\n");
        }   
    return 0;
     }

我得到了这个结果:

    1 2 3 4 5 6 7 8 9
    2 3 4 5 6 7 8 9 0
    3 4 5 6 7 8 9 0 8
    4 5 6 7 8 9 0 7 3
    5 6 7 8 9 0 6 4 13247168
    6 7 8 9 0 5 5 13247168 0
    7 8 9 0 4 6 13247168 0 4199400
    8 9 0 3 7 13247168 0 4199400 0
    9 0 2 8 13247168 0 4199400 0 0

现在这已成为我理解的一个严重问题和困惑。如果你知道背后的原因,请帮助我。谢谢。

最佳答案

在将第一个维度强加给编译器时,由于编译器发现您正在尝试使用超出维度可以包含的更多数据进行初始化,因此您会收到警告。

现在使用 int t[][1] = {1,2,3,4,5,6,7,8,9};,您让编译器计算大小自动地。但这并不意味着将对边界进行运行时检查。

一旦在没有警告的情况下编译,就没有运行时来检查是否捕获了动态访问越界。您在运行时遇到的只是读/写越界的未定义行为

关于c - 如果数组仅使用列值定义,则当数组超出时没有错误,没有警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54342116/

相关文章:

c++ - 为什么 C++ 中长度为 n 的字符字符串在 [n] 索引上总是有一个空字符作为垃圾?

c - 定义一个大于 unsigned int 限制的大型数组

javascript - 对象数组[key]

c - 如何在 C 中创建(和使用)指向字符串数组的指针数组?

c - 使用c中的指针求二维数组中的总和

命令行参数,打印列和行

c# - 从 C# 项目调用 c native 函数

c - 当程序正常退出或异常退出时执行一个函数

opencv - 我可以使用计算的 Homography 将 2D 坐标从一台相机转换到另一台立体相机吗?

c++ - C++中的动态二维数组和内存泄漏