3no*_*tur 0 c struct multidimensional-array
我想分配一个自定义类型“cell”的二维数组,它是一个结构。但是,我做错了,请参阅下面的代码。你能告诉我我的错误在哪里吗?
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int variable_1;
int variable_2;
int variable_3;
} cell;
void initialiseArray(unsigned long rows, unsigned long columns, cell array[rows][columns])
{
for (int i = 0; i < rows; i = i + 1)
for (int j = 0; j < columns; j = j + 1)
{
array[i][j].variable_1 = 0;
array[i][j].variable_2 = 0;
array[i][j].variable_3 = 0;
}
}
int main()
{
unsigned long rows = 200;
unsigned long columns = 250;
cell* array[rows];
for (unsigned long i = 0; i < rows; i = i + 1)
array[i] = malloc(columns * sizeof(cell));
if (array == NULL)
{
printf("Error in ""main"": Memory could not be allocated.\n");
return 3;
}
initialiseArray(rows, columns, array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
cell* array[rows];是在堆栈上分配的可变长度数组 (VLA);每行都在堆上分配array[i] = malloc(columns * sizeof(cell));。
array我建议您在堆栈或堆上分配:
cell array[rows][columns];
initialiseArray(rows, columns, array);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您无法初始化 VLA,因此您仍然需要initialiseArray()(或使用memset())。在 Linux 上,默认堆栈大小为 8 MB,如果您尝试使用超过该大小,您的程序可能会出现段错误。
cell (*array)[rows][columns] = malloc(sizeof *array);
initialiseArray(rows, columns, *array);
Run Code Online (Sandbox Code Playgroud)
正如 @yano 提到的,您可以使用calloc()对内存进行零初始化,因此您不一定需要调用initialiseArray(). 在 Linux 上,限制是可用物理内存 + 交换空间的大小(例如 16 GB),如果您尝试使用超过可用的malloc()/calloc()将返回 NULL,您可以轻松处理。
在这种情况下,两者都可以。如果rows和columns仅在运行时知道,则更喜欢堆分配。
更喜欢传递变量而不是 的类型sizeof。
虽然i和j是完全有效的循环变量,但在这种情况下请考虑使用r/row或c/ col/ column。