释放三重指针
freeing a triple pointer
在 运行 之后(它编译得很好),我得到 "double free or corruption",但只有当我将 n 设置为奇数时才会这样。连n都没问题,我真的很迷茫...
#include<stdio.h>
#include<stdlib.h>
typedef unsigned int uint;
int main(void)
{
int i, j;
uint n = 3;
uint*** a = (uint***) malloc( n* sizeof(uint**) );
for(i=0; i<n; i++)
{
*(a + i) = (uint**) malloc( (n)* sizeof(uint*) );
for(j=0; j<n; j++);
{
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++);
{
free (*((*(a + i))+j));
}
free (*(a + i));
}
free(a);
}
这是你的问题:
for(j=0; j<n; j++);
// ^
{
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
for
行末尾的这个额外的 ;
意味着你有一个空循环体:
for(j=0; j<n; j++)
;
...后跟一个赋值:
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
此时j == n
(因为前面的循环),所以你写越界了。
您的 free
代码中还存在相同的错误(copy/paste?)。
在 运行 之后(它编译得很好),我得到 "double free or corruption",但只有当我将 n 设置为奇数时才会这样。连n都没问题,我真的很迷茫...
#include<stdio.h>
#include<stdlib.h>
typedef unsigned int uint;
int main(void)
{
int i, j;
uint n = 3;
uint*** a = (uint***) malloc( n* sizeof(uint**) );
for(i=0; i<n; i++)
{
*(a + i) = (uint**) malloc( (n)* sizeof(uint*) );
for(j=0; j<n; j++);
{
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++);
{
free (*((*(a + i))+j));
}
free (*(a + i));
}
free(a);
}
这是你的问题:
for(j=0; j<n; j++);
// ^
{
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
for
行末尾的这个额外的 ;
意味着你有一个空循环体:
for(j=0; j<n; j++)
;
...后跟一个赋值:
(*((*(a + i))+j)) = (uint*) malloc(1 * sizeof(uint));
此时j == n
(因为前面的循环),所以你写越界了。
您的 free
代码中还存在相同的错误(copy/paste?)。