为三级指针分配内存:C

3

我正在尝试为三级指针分配内存。我的代码如下:

int i, j;
int n = 4;

int ***X = (int ***) malloc(sizeof(int) * n);
for(i = 0; i < n; i++){
      printf("h\n");
      X[i] = (int **) malloc(sizeof(int) * n);
      for(j = 0; j < n; j++){
            printf("j\n");
            X[i][j] = (int *) malloc(sizeof(int) * n);
      }
}

X[0][0][0] = 14;
X[1][2][2] = 15;

当我在Linux上运行时,会出现*** glibc detected *** triplePointer: double free or corruption (out): 0x0000000000ea3050 ***错误,但我完全不知道它的含义。但是当我在Windows上使用-Wall标志运行时,没有错误。也许有人可以帮我找到我的错误所在。
此外,我目前正在硬编码,通过语句X[0][0][0] = 14;。是否有一种方法可以通过某些随机值填充这个三重指针的所有插槽?

4
除了最内层的sizeof()参数正确外,其余参数均不正确。我怀疑在Windows下编译时您正在使用32位,这种情况下'int'和任意数据指针的大小相同。将它编译为64位进程,您可能会看到与Linux发行版类似的行为。 - WhozCraig
当然!我简直不敢相信我错过了那个。啊…… - user3754974
@user3754974 【这将消除你所有的疑虑】(http://c-faq.com/aryptr/dynmuldimary.html) - Jayesh Bhoi
1个回答

10

请尝试下面的代码-

int ***X = (int ***) malloc(sizeof(int**) * n); //FIX 1
for(i = 0; i < n; i++){
  printf("h\n");
  X[i] = (int **) malloc(sizeof(int*) * n);  // FIX 2
  for(j = 0; j < n; j++){
        printf("j\n");
        X[i][j] = (int *) malloc(sizeof(int) * n);
  }
}

当你为三级指针分配内存时,首先需要分配n个双指针的内存。

int ***X = (int ***) malloc(sizeof(int**) * n); // Not sizeof(int)

那么对于这个双指针,你需要为n个单指针分配内存。

for(i = 0; i < n; i++)
  X[i] = (int **) malloc(sizeof(int*) * n);

对于那些单指针,你最终需要分配内存

for(i = 0; i < n; i++)
 for(j = 0; j < n; j++)
        X[i][j] = (int *) malloc(sizeof(int) * n);

这是分配的方式!


虽然会多一些工作,但使用目标指针 解引用 后的大小比在 sizeof() 运算符中编写类型更直观。请参见下面的内容,包括建议在 C 程序中删除 malloc() 强制转换的建议。

int ***X = malloc(sizeof(*X) * n);
for (i = 0; i < n; i++)
{
    printf("h\n");
    X[i] = malloc(sizeof(*(X[i])) * n);
    for (j = 0; j < n; j++)
    {
        printf("j\n");
        X[i][j] = malloc(sizeof(*(X[i][j])) * n);
    }
}

请注意,您看到的唯一一个实际的类型int ***X。其他所有内容都基于该初始声明。为什么这可能更好?例如:将整个内容更改为double的3D矩阵只需要更改一行double ***X = ...


1
这段代码确实解决了问题,但最好解释一下它的原理。 - cdhowie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接