執行此代碼時出現段錯誤。它列印 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;
}
我想知道為什么我從上面的代碼中得到了這個錯誤。請問誰能給我解釋一下?
uj5u.com熱心網友回復:
真正的問題在于您在free()使用ptr. 有一次,你增加一個指標,它的地址跳轉到由 分配的下一個地址malloc()。始終確保*ptr與 相同ptr[0]。因此,要解決此問題,您可以將ptr5 遞減,或創建一個復制的指標。
給出的地址示例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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480161.html
