c - 在函数中重新分配后出现段错误

标签 c pointers realloc double-pointer

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

代码如下:

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 上遇到段错误。

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

最佳答案

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

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

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

两个改进建议:

不要将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;

关于c - 在函数中重新分配后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993497/

相关文章:

java - C#/Java如何存储二维数组,与C++有何不同?

java - java中调用在另一台服务器上运行的C函数的最佳方法是什么?

c - 什么是静态 int ** volatile ptr?

c - Arduino 和指向字符数组的指针

c++ - 关于在 C++ 代码中使用 realloc 实现的问题

c - realloc() : invalid next size

c - 最简单的重新分配方法

c++ - 内联函数,总是n+1份代码,其中 'n'是调用次数

c - 什么时候应该在结构中使用指向结构的指针?

c - RFID RC522读卡接线Pi