我有以下二维数组N * 2(我无法修改其声明):
bool* myArray[2];
int N;
我想用calloc分配它但没有成功:
myArray = calloc(N, 2*sizeof(bool));
for (int i=0; i!=N; i++)
{
myArray[i] = calloc(2, sizeof(bool));
}
编译器引发了我(在第一个calloc上):
error: incompatible types in assignment of 'void*' to 'bool* [2]'
我做错了什么?
答案 0 :(得分:3)
此代码:
bool* myArray[2];
int N;
不会声明一个二维数组,而是一个指针数组。这是一个重要的区别,因为二维数组不是指向数组的指针数组 - 它们只是连续存储,就像一维数组一样(一个"行"之后其他)。
因此,正如您所声明的那样,您无法更改声明,而是让您解释一下指针数组所需的内容。在您的声明中,您正好声明了2个指针,因此N
只能表示"第二个维度"就像那些指针所指向的数组中的元素数一样。使用此声明,您可以拥有2次N
个bool数组。分配它们看起来像这样:
myArray[0] = calloc(N, sizeof(bool));
myArray[1] = calloc(N, sizeof(bool));
没有必要为myArray
本身分配空间,您的申报已经自动存储。
答案 1 :(得分:2)
请改为:
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));
}
PS:在C don't cast malloc中,当我们希望编译C ++时,我们会这样做。
答案 2 :(得分:1)
您无法重新分配myArray
的原因是myArray
不是指针。它是一个指向bool
的两个指针的数组。与您的描述相反,它也不是&#34; 2维数组&#34;。
您需要做的就是
for (int i=0; i < 2; ++i)
{
myArray[i] = calloc(N, sizeof(bool));
}
然后您可以使用&#39; 2 * N&#39;数组,例如将所有元素设置为true
;
for (int i = 0; i < 2; ++i)
{
for (j = 0; j < N; ++j)
myArray[i][j] = true;
}
如果你交换索引的顺序(例如在上面的内循环中使用myArray[j][i]
)并使用myArray
作为&#39; N * 2&#39;数组而不是&#39; 2 * N&#39;数组,结果将是未定义的行为。没有改变myArray
的声明,你没有改变它的解决方案 - 你说过你不想这样做。