【问题标题】:Segmentation fault after realloc in function函数中重新分配后的分段错误
【发布时间】:2017-12-13 02:14:03
【问题描述】:

我创建了这段代码来测试我在主代码中遇到的一个错误,它也存在同样的问题。我总是遇到分段错误或损坏的数据(零或奇怪的数字)。

代码如下:

int *p=NULL;
int func (int **point);

int main() {
    int num = 5647;
    p = malloc(sizeof(int)*2);
    p[0] = num;
    p[1]= 657;
    printf("%d\n", p[0]);
    printf("%d\n", p[1]);
    func(&p);
    printf("%d\n", p[0]);
    printf("%d\n", p[1]);
    printf("%d\n", p[2]);
    printf("%d\n", p[3]);
    return 0;
}

int func (int **point){
    *point = realloc(*point,sizeof(int)*4);
    if (*point==NULL){
        printf("\n abort \n");
        exit(0);
    }
    *point[0] = 867;
    *point[1]= 777;
    *point[2] = 67;
    *point[3]= 77;
}  

我在*point[1]=777; 上遇到了分段错误。如果我想像point[1]=777; 那样做,我会得到错误的数据。随着int func (int **point);func(&p); 的任何更改,我在realloc 上遇到分段错误。

请告知,我已阅读有关双指针的信息并尝试遵循我找到的所有解决方案,但每次我都收到此错误。

【问题讨论】:

    标签: c pointers realloc double-pointer


    【解决方案1】:

    您的问题是运算符优先级,将*point[0] 更改为(*point)[0] 等等。

    你现在拥有的是*(point[0])。您将指向单个元素的指针视为指向多个连续元素的指针,然后取消引用某个不确定值作为地址。这会导致未定义的行为,幸运的是,这表现为崩溃。

    更改后,您首先取消引用 point,然后使用该地址来索引您分配的连续元素。

    两个改进建议:

    不要将realloc 的结果直接赋值给*point。如果调用失败,那么你会泄漏原始内存。将其分配给临时先进行验证。

    另外,尽量不要重复类型。而不是sizeof(int) 尝试sizeof(**point),即输出缓冲区应该指向的任何内容。这样,如果您将类型从 int 更改为其他类型,您的代码中就不会出现静默错误。

    void *point_check = realloc(*point,sizeof(**point)*4);
    if (point_check == NULL){
        printf("\n abort \n");
        exit(0); // If this ever returns instead of exit, `*point` will not leak
    }
    *point = point_check;
    

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 2020-08-15
      • 2017-09-08
      • 2021-10-11
      • 2016-01-08
      • 2020-03-29
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多