Calloc 一个二维数组

db2*_*791 0 c arrays calloc

要制作二维数组,我目前正在使用以下内容:

int * own;

own = (int *)calloc(mem_size, sizeof(int));

for (i=0;i<mem_size;i++){
    own[i] = (int *)calloc(3, sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)

但是,每次我引用 own[i][j] 时,都会收到一条错误消息,指出下标值既不是数组也不是指针也不是向量。

R S*_*ahu 6

使用:

int ** own; // int**, not int*
own = calloc(mem_size, sizeof(int*)); //int*, not int
                                      // And remove the explicit cast.
Run Code Online (Sandbox Code Playgroud)


Joh*_*ger 6

但是,每次我引用 own[i][j] 时,都会收到一条错误消息,指出下标值既不是数组也不是指针也不是向量。

这是正确的。 own[i]等价于*(own + i),其类型为int。您不能将下标运算符应用于int.

请注意,您的代码似乎试图创建的不是二维数组,而是指针数组。如果这真的是你想要的,那么own应该有 type int **,你应该相应地调整第一个calloc()调用。但是,如果您真的想要动态分配二维数组,那么这将是:

int (*own)[3];

own = calloc(mem_size, sizeof(*own));
Run Code Online (Sandbox Code Playgroud)

请注意,不需要单独分配(或释放)行。

但是还要注意,如果您own在超出范围之前不需要重新分配,如果您可以假设至少有一个 C99 编译器,并且 ifmem_size永远不会太大,那么您可以通过变量更轻松地做到这一点-长度数组:

int own[mem_size][3] = {{0}};
Run Code Online (Sandbox Code Playgroud)

在这种情况下根本不需要显式动态分配或解除分配,如果不需要,可以省略初始化程序。(我包括初始化程序是因为calloc()对分配的空间执行等效的初始化。)“太大”应该相对于在堆栈上分配的数组来解释。