访问二维数组的正确方法 - C

标签 c arrays multidimensional-array

假设我有这个动态分配的二维数组:

//Example of a 3 row * 2 columns int array
int (*arr)[2] = malloc(sizeof(int[3][2]));

但是,然后我发现如果我这样做:

arr[0][5] = 1;

编译器没有提示,至少用 valgrind 测试时,它也没有提示。它不会,除非我尝试访问超过分配空间大小的空间。

我发现自动数组也会发生同样的情况:

int arr[3][2];
arr[0][5] = 1; //Code works without errors 

我现在的问题是:如果编译器接受 arr[0][5] = 1,那么声明例如 int arr[3][2]; 有什么意义; 无论如何?

我正在使用 GCC 编译器

最佳答案

一般来说,不要超出您分配的内存范围。

默认情况下,Clang 将对这两个示例发出警告,而 GCC 将在没有实际使用变量的情况下对这两个示例发出警告(这是死代码消除器的错误)。如果变量被使用或声明为 volatile,您可以使用 -O2 -Wall -Wextra 启用警告。

使用 GCC 和 Clang,这样做是“安全的”;每次都会发生同样的事情。

但是,这是未定义的行为,因此不是一个好主意。对于执行此操作以使您的计算机长出腿并走开的程序来说,这是完全有效的。

一种等效的赋值方式是:

arr[2][1] = 1;

这是基于数组元素按顺序存储在内存中的假设。

因此,&arr[5][0] 在技术上与 &arr[2][1] 相同,但不应使用它。

我的建议:

int arr[3][2];
int x, y;

for( x = 0; x < 3; x++ )
    for( y = 0; y < 2; y++ )
        arr[x][y] = x * y;

这保证是安全的。

关于访问二维数组的正确方法 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59132312/

相关文章:

c - 在 C 中分配 128 位整数

arrays - julia 选择数组/矩阵中除一个元素外的所有元素

php - 按索引偶数或奇数将数组拆分为两个数组

c++ - 传递 char ** 作为引用并返回 const char * 作为引用

php - 将平面数组按键分组为多维数组,如果我们不知道有多少层。 PHP

C中的字符计数在输入字符后不会返回任何值

python - 适用于 Python 2.7 的 Visual Microsoft Visual C++ 编译器与 MinGW

c - STM32F103 在 RX 中断时无法通过 UART 接收数据

c - 当 0xFF 在 char 数组中时,它与下一个 char 一起被读取为整数

javascript - 如何在 for-in 循环中使用 If 语句?