为三指针分配内存:C

时间:2014-07-30 05:31:50

标签: 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;

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

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

1 个答案:

答案 0 :(得分: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);
  }
}

首先为三重指针分配内存时,需要分配内存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()运算符中的类型更为直截了当。见下文including the advised removal of malloc() casts in C programs.

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 = ...