c-使用malloc和混叠时的分段错误



以下代码是从我的原始代码中提取出来的,会导致分段错误。为了进一步研究,我使用了一个调试器,发现当I=0和j=1时,分割故障发生在*pts[i][j]=...的行。

当我用a代替*pts时,它工作得很好。然而,*pts只是a的别名,所以我认为行为应该是相同的。有人能告诉我为什么会出现这个错误吗?

#include<stdlib.h>
int main(){
double*** a;
int n = 3;
int m = 3;
int l = 3;
a = (double***)malloc(n * sizeof(double**));
double**** pts = &a;
for(int i=0; i<n; i++){
*pts[i] = (double**)malloc(m * sizeof(double*));
for(int j=0; j<m; j++){
*pts[i][j] = (double*)malloc(l * sizeof(double));
}
}
}

变量订阅绑定比指针取消引用更紧密,因此

*pts[i][j]

被解析并执行,就像您编写一样

*(pts[i][j])

而不是

(*pts)[i][j]

首先,我想声明pts[i]*(pts + i)相同,*pts[i]**(pts + i)相同。

在这段代码中,您应该使用pts[i]或像一样使用*(pts +i)

#include<stdlib.h>
int main(){
double*** a;
int n = 3;
int m = 3;
int l = 3;
a = (double***)malloc(n * sizeof(double**));
double**** pts = &a;
for(int i=0; i<n; i++){
pts[i] = (double**)malloc(m * sizeof(double*)); // *(pts + i)
for(int j=0; j<m; j++){
pts[i][j] = (double*)malloc(l * sizeof(double)); // *(*(pts + i) + j)
}
}
}

最新更新