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