基于calloc的多维数组分配

基于calloc的多维数组分配,c,arrays,memory-management,compiler-errors,calloc,C,Arrays,Memory Management,Compiler Errors,Calloc,我有以下二维数组N*2(我无法修改其声明): 我想用calloc分配它,但没有成功: myArray = calloc(N, 2*sizeof(bool)); for (int i=0; i!=N; i++) { myArray[i] = calloc(2, sizeof(bool)); } 编译器(在第一次调用时)引发我: 我做错了什么?请改为: bool (*myArray)[2] = calloc(N, sizeof(*myArray)); 或者,如果您不想修改您的声明,只需

我有以下二维数组N*2(我无法修改其声明):

我想用calloc分配它,但没有成功:

myArray = calloc(N, 2*sizeof(bool));
for (int i=0; i!=N; i++)
{
    myArray[i] = calloc(2, sizeof(bool));
}
编译器(在第一次调用时)引发我:

我做错了什么?

请改为:

bool (*myArray)[2] = calloc(N, sizeof(*myArray));

或者,如果您不想修改您的声明,只需在这里去掉第一个calloc并修改for循环:

myArray = calloc(N, 2*sizeof(bool)); // you do not need that
for (int i=0; i < 2; i++)
{
    myArray[i] = calloc(N, sizeof(bool));
}
myArray=calloc(N,2*sizeof(bool));//你不需要这个
对于(int i=0;i<2;i++)
{
myArray[i]=calloc(N,sizeof(bool));
}

PS:在我们希望编译C++时,我们这样做:

而不是这样做:

bool (*myArray)[2] = calloc(N, sizeof(*myArray));

或者,如果您不想修改您的声明,只需在这里去掉第一个calloc并修改for循环:

myArray = calloc(N, 2*sizeof(bool)); // you do not need that
for (int i=0; i < 2; i++)
{
    myArray[i] = calloc(N, sizeof(bool));
}
myArray=calloc(N,2*sizeof(bool));//你不需要这个
对于(int i=0;i<2;i++)
{
myArray[i]=calloc(N,sizeof(bool));
}

PS:在C++中,当我们希望编译C++时,我们这样做。

< p>这个代码:

bool* myArray[2];
int N;
不声明二维数组,但声明指针数组。这是一个重要的区别,因为二维数组不是指向数组的指针数组——它们只是连续存储,就像一维数组一样(一行接一行)

因此,当您声明无法更改声明时,让我们解释一下指针数组需要什么。通过您的声明,您只声明了2个指针,因此
N
只能表示“第二维度”,即这些指针指向的数组中的元素数。使用此声明,您可以有2倍的
N
bool数组。分配它们将如下所示:

myArray[0] = calloc(N, sizeof(bool));
myArray[1] = calloc(N, sizeof(bool));
无需为myArray本身分配空间,通过您的声明,它已经有了自动存储。

此代码:

bool* myArray[2];
int N;
不声明二维数组,但声明指针数组。这是一个重要的区别,因为二维数组不是指向数组的指针数组——它们只是连续存储,就像一维数组一样(一行接一行)

因此,当您声明无法更改声明时,让我们解释一下指针数组需要什么。通过您的声明,您只声明了2个指针,因此
N
只能表示“第二维度”,即这些指针指向的数组中的元素数。使用此声明,您可以有2倍的
N
bool数组。分配它们将如下所示:

myArray[0] = calloc(N, sizeof(bool));
myArray[1] = calloc(N, sizeof(bool));

无需为
myArray
本身分配空间,通过您的声明,它已经具有自动存储。

无法重新分配
myArray
的原因是
myArray
不是指针。它是指向
bool
的两个指针数组。与您的描述相反,它也不是“二维数组”

你需要做的就是

for (int i=0; i < 2; ++i)
{
    myArray[i] = calloc(N, sizeof(bool));
}

如果交换索引顺序(例如,在上面的内部循环中使用
myArray[j][i]
),并将
myArray
用作“N*2”数组而不是“2*N”数组,则结果将是未定义的行为。如果不更改
myArray
的声明(您说过不想这样做),就没有办法改变这一点。

无法重新分配
myArray
的原因是
myArray
不是指针。它是指向
bool
的两个指针数组。与您的描述相反,它也不是“二维数组”

你需要做的就是

for (int i=0; i < 2; ++i)
{
    myArray[i] = calloc(N, sizeof(bool));
}

如果交换索引顺序(例如,在上面的内部循环中使用
myArray[j][i]
),并将
myArray
用作“N*2”数组而不是“2*N”数组,则结果将是未定义的行为。如果不更改
myArray
的声明(您已经说过不想这样做),就没有办法改变这一点。

myArray=calloc(N,2*sizeof(bool))->
myArray=calloc(N,2*sizeof(bool*)您的数组已经有2个bool*,您不需要myArray=calloc(N,2*sizeof(bool))<代码>bool*myArray[2]
calloc()
返回一个
void
指针,您正在将其分配给
bool
指针。@GauravPathak这在C中是正确的操作。
myArray=calloc(N,2*sizeof(bool))->
myArray=calloc(N,2*sizeof(bool*)您的数组已经有2个bool*,您不需要myArray=calloc(N,2*sizeof(bool))<代码>bool*myArray[2]
calloc()
返回一个
void
指针,您正在将其分配给
bool
指针。@GauravPathak这在C中是正确的操作。我无法更改标题中myArray的声明问题状态为“(我无法修改其声明)”。所以,不管是什么原因,答案应该解释这不是2D数组,而是指向数组的指针数组。。。一个简单的解决方案就是去掉第一行:
myArray=calloc(N,2*sizeof(bool))@Coldspeed确实如此,但我想在这种情况下,一行程序看起来更漂亮。@rudy如果你需要一个cast,你就使用一个编译器。对于编译C代码来说,这不是一个好主意。我不能在标题中更改myArray的声明问题状态为“(我不能修改它的声明)”。所以,不管是什么原因,答案应该解释这不是2D数组,而是指向数组的指针数组。。。一个简单的解决方案就是去掉第一行:
myArray=calloc(N,2*sizeof(bool))@Coldspeed确实如此,但我想在这种情况下,一行程序看起来更漂亮。@rudy如果你需要一个cast,你就使用一个编译器。这不是编译C代码的好主意。当你写“二维数组不是数组的数组”时,你的意思是“二维数组不是指针数组”吗?这样似乎更有意义。@IanAbbott我写了更抽象的数组,因为在som中