簡體   English   中英

為什么添加指針+ = work,但指針+ 1不?

[英]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 ,因此指針不匹配。

進行指針運算時應用的實際偏移量總是取決於指針的類型。 由於pointerint * ,因此實際的偏移量將乘以sizeof(int) 如果sizeof(void)1或者它是char *指針( sizeof(char) == 1 ),則不會發生乘法。

指針運算可以使用++=來完成。 它與產生的錯誤無關。

malloc返回void *類型。 C標准說:

C11:6.2.5類型(第19頁):

void類型包含一組空值; 它是一種不完整的類型 ,無法完成。

6.5.6加法運算符(p2):

另外,兩個操作數都應具有算術類型 ,或者一個操作數應是指向完整對象類型指針 ,另一個操作數應具有整數類型。 (遞增相當於添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM