[英]Why does adding to a pointer with += work, but pointer + 1 doesn't?
我正在為一個數組分配內存,但我正在移動指針向前指向一點點。 訪問元素工作正常。 它開始產生釋放已分配內存的問題。 Malloc抱怨從未分配被釋放的指針。 這個簡化的代碼可以重現這個問題:
int *pointer = malloc(sizeof(int)) + 1;
free(pointer - 1);
我開始嘗試,發現代碼的這種輕微變化可以工作。
int *pointer = malloc(sizeof(int));
pointer += 1;
free(pointer - 1);
什么是+ =做不同只是添加1指針malloc返回一行?
malloc
的返回類型是void *
,根據標准,它不能用於指針算術。
但是,有一個GNU擴展,將sizeof(void)
視為1
,這就是你的第一個片段編譯的原因。 稍后, pointer - 1
減去sizeof(int)
而不是1
,因此指針不匹配。
進行指針運算時應用的實際偏移量總是取決於指針的類型。 由於pointer
是int *
,因此實際的偏移量將乘以sizeof(int)
。 如果sizeof(void)
為1
或者它是char *
指針( sizeof(char) == 1
),則不會發生乘法。
指針運算可以使用+
或+=
來完成。 它與產生的錯誤無關。
malloc
返回void *
類型。 C標准說:
void
類型包含一組空值; 它是一種不完整的類型 ,無法完成。
另外,兩個操作數都應具有算術類型 ,或者一個操作數應是指向完整對象類型的指針 ,另一個操作數應具有整數類型。 (遞增相當於添加1.)
void *
是指向不完整類型的指針 。 因此,不會對void *
類型進行添加。 這就是為什么
int *pointer = malloc(sizeof(int)) + 1;
是錯誤的,會導致執行free(pointer - 1);
時出現運行時錯誤free(pointer - 1);
。
看到其他答案,將代碼更改為
int *pointer = (int *)malloc(sizeof(int));
要么
int * pointer = new int[1];
會讓你做你想做的事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.