为三指针分配内存:C

use*_*974 2 c pointers

我正在尝试为三指针分配内存.我有以下内容:

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;
Run Code Online (Sandbox Code Playgroud)

当我在Linux上运行它时,我得到*** glibc detected *** triplePointer: double free or corruption (out): 0x0000000000ea3050 ***错误,我完全不知道它是什么意思.但是当我在Windows上使用-Wall标志运行它时,我没有错误.有人可以帮我找到我的错误所在.

此外,我目前正在通过声明进行硬编码X[0][0][0] = 14;.有没有办法可以通过一些随机值填充这个三重指针的所有插槽?

Sat*_*ish 8

请尝试以下代码 -

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

首先为三重指针分配内存时,需要分配内存n双指针.

int ***X = (int ***) malloc(sizeof(int**) * n); // Not sizeof(int)
Run Code Online (Sandbox Code Playgroud)

然后对于那个双指针,你需要为n单指针分配内存

for(i = 0; i < n; i++)
  X[i] = (int **) malloc(sizeof(int*) * n);
Run Code Online (Sandbox Code Playgroud)

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

for(i = 0; i < n; i++)
 for(j = 0; j < n; j++)
        X[i][j] = (int *) malloc(sizeof(int) * n);
Run Code Online (Sandbox Code Playgroud)

这是分配的方式!


虽然工作量稍微多一点,但是使用解除引用的目标指针的大小比在sizeof()运算符中编码类型更为直截了当.请参阅下文,包括建议删除malloc()C程序中的演员表.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您在此中看到的实际类型的唯一位置是int ***X.其他一切都基于该初始声明.为什么这可以说"更好"?例如:要将整个事物更改为3D矩阵,double需要更改一行:double ***X = ...