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

执行此代码时出现段错误。它打印 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;
}

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

回答1

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

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

Before decrementing 0x213f2b4
After decrementing 0x213f2a0

5递减的原因,是这两个十六进制values的区别,即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;

相似文章

最新文章