使用calloc进行多维数组分配

时间:2017-06-23 12:12:22

标签: c arrays memory-management compiler-errors calloc

我有以下二维数组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]'

我做错了什么?

3 个答案:

答案 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的声明,你没有改变它的解决方案 - 你说过你不想这样做。