基于calloc的多维数组分配
我有以下二维数组N*2(我无法修改其声明): 我想用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)); 或者,如果您不想修改您的声明,只需
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中