我正在尝试为三指针分配内存。我有以下内容:
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;
进行编码。有没有办法可以通过一些随机值填充这个三重指针的所有插槽?
答案 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 = ...