【问题标题】:segmentation fault when using malloc and aliasing使用 malloc 和别名时的分段错误
【发布时间】:2020-07-17 14:56:49
【问题描述】:

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

当我将 *pts 替换为 a 时,它运行良好。但是,*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));
        }
    }
}

【问题讨论】:

  • 我觉得有必要链接到有关成为Three Star Programmer 的页面。
  • pts[0] 好的; pts[1] 不,不存在(用于比较目的除外)
  • OT:关于:a = (double***)malloc(n * sizeof(double**)); 在 C 中,返回的类型是 void*,可以分配给任何指针。强制转换只会使代码混乱并且容易出错。建议删除该演员表。 2) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功 (==NULL) 则调用 perror( "malloc failed" );,以便将您的错误消息和系统认为发生错误的文本原因传递给 stderr

标签: c pointers malloc


【解决方案1】:

变量订阅比指针解引用更紧密,所以

*pts[i][j]

就像你写的一样被解析和执行

*(pts[i][j])

而不是

(*pts)[i][j]

【讨论】:

  • 如果有任何混淆,这也适用于*pts[i],与(*pts[i])相同
【解决方案2】:

首先,我要声明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)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2014-03-29
    • 2011-04-22
    相关资源
    最近更新 更多