我必须询问我从这段代码中得到的中止(核心转储)错误

I have to ask about aborted(core dumped) error i get from this code

我在执行这段代码时遇到段错误。它打印 5 个数字中最大的一个,这些数字存储在堆内存中。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(5 * sizeof(int));
    *ptr = 5;
    *(ptr + 1) = 7;
    *(ptr + 2) = 2;
    *(ptr + 3) = 9;
    *(ptr + 4) = 8;

    int *ptr_max = (int *)malloc(sizeof(int));
    *ptr_max = 0;

    for (int i = 0; i < 5; i++) {
        if (*ptr_max < *ptr) {
            *ptr_max = *ptr;
            ptr++;
        } else
            ptr++;
    }
    printf("%d\n", *ptr_max);
    free(ptr);
    free(ptr_max);
    return 0;
}

我想知道为什么我从上面的代码中得到这个错误。谁能给我解释一下吗?

真正的问题出在你 free()-ing ptr 的时候。有一次,您增加一个指针,它的地址跳转到由 malloc() 分配的下一个地址。始终确保 *ptrptr[0] 相同。因此,要解决此问题,您可以将 ptr 减 5,或创建一个复制的指针。

free()的地址示例,它们不指向同一个内存块:

Before decrementing 0x213f2b4
After decrementing 0x213f2a0

5的原因是这两个十六进制值之差20,同sizeof(int) * 5.

ptr -= 5;

您可以创建指针的副本,然后对复制的指针执行操作:

int *my_copied_ptr = ptr; // you don't need to free this pointer

然后,free()他们:

free(ptr);
free(ptr_max);

现在,要在大型代码库中进一步避免这些错误,请尝试使用 [] 运算符,如下所示:

ptr[0] = 5;
ptr[1] = 7;
ptr[2] = 2;
ptr[3] = 9;
ptr[4] = 8;