C中的自由指针时转储内核

C中的自由指针时转储内核,c,pointers,coredump,C,Pointers,Coredump,我的代码结构如下所示: bool adj = true; float ***a1=NULL, ***a2=NULL; if (adj) { /* allocate memory for ***a1 */ /* code body */ } else { /* allocate memory for ***a2 */ /* code body */ } /* free ***a1 */ /* free ***a2 */ 当我编译代码时,除了在最后屏幕弹出分段错

我的代码结构如下所示:

bool adj = true;
float ***a1=NULL, ***a2=NULL;

if (adj) {
    /* allocate memory for ***a1 */
    /* code body */
} else {
    /* allocate memory for ***a2 */
    /* code body */
}

/* free ***a1 */
/* free ***a2 */
当我编译代码时,除了在最后屏幕弹出
分段错误(内核转储)
外,其他一切都运行顺利。我怀疑的原因可能来自
if…else…
:我只在
adj=true
时为***a1分配内存,并保留
***a2=NULL
;但我最后两行都放了。为了避免这个错误,我应该写:

if (adj) { /* free ***a1 */ } else { /* free ***a2 */ }
我说得对吗


注意:每个3D指针的大小(
nt*nx*nz*sizeof(float)
)小于
10^8
。(假设三维指针
a1,a2
可以写成
a1[it][ix][iz]
,其
it,ix,iz
的范围为
0~nt-1,0~nx-1,0~nz-1

使用调试器遍历程序。请发布一条消息。空闲时发生崩溃()表示您在程序的其他地方对同一个变量存在与指针相关的错误。您能证明您没有两次释放同一个指针或释放一个未用于分配内存的指针吗?调用
free(NULL)
完全可以。你的原始程序的那部分很好。但是您无法成功地将分配的内存用作3D数组,因为编译器不知道每个维度有多大。必须将分配的内存视为1D数组,并根据
it
ix
iz
变量显式计算索引。