#include<stdio.h>
int main(){
int * ptr=(int *)malloc(40);
printf("%d",sizeof(ptr));
}
當我運行這個,輸出爲8 ...這裏發生了什麼...爲什麼輸出8?有人可以解釋我在這裏發生了什麼使用malloc指針
#include<stdio.h>
int main(){
int * ptr=(int *)malloc(40);
printf("%d",sizeof(ptr));
}
當我運行這個,輸出爲8 ...這裏發生了什麼...爲什麼輸出8?有人可以解釋我在這裏發生了什麼使用malloc指針
malloc()
返回一個指向40字節內存(可能是10個整數)的指針,並將其指定給ptr
。 sizeof(ptr)
爲8的原因是因爲您使用的是64位機器,指針大小爲8個字節。
您應該在malloc()
中使用sizeof()
,因爲它是良好的形式,並且可以避免問題,如果類型的大小發生變化(跨平臺或其他)。如果你真的想空間,10個整數,然後使用:
int *ptr = malloc(10 * sizeof *ptr);
這種分配10手類型ptr
點的大小,在這種情況下int
。這樣做的好處是你可以改變類型而不改變malloc()
sizeof
運算符是編譯時操作符,任何指針的大小在您的機器上都是8個字節。
無法檢索malloc
-ed內存區的動態大小。否則你必須知道它,或者將它保存在某個地方。
您可以考慮使用Boehm's conservative garbage collector那麼你會打電話給GC_malloc
而不是malloc
,你會不會需要調用free
(或GC_free
),你可以使用GC_size(p)
獲得先前GC_malloc
-ed存儲區的近似大小從p
開始(但我不建議使用GC_size
)。
如果在Linux上使用malloc
,學習如何使用valgrind打獵內存泄漏缺陷,並與gcc -Wall -g
變量ptr
編譯是int,則您的系統碰巧有8個字節大小的指針。
ptr是一個pointer.its在您的系統上打印指針的大小。 由於ptr保存地址,8字節是在64位機器上保存地址所需的大小。 這是編譯器特有的。你不能檢索分配給指針的大小。
如果你有這個疑問,那麼你應該也會對free()如何在不知道已經分配給指針的大小的情況下釋放內存有所疑問。
我已經在我的Windows 32位機器上試過這個,我得到了ans 4個字節,我認爲ptr是一個指向int的指針,顯示它的相關性
因爲這是'ptr'的大小。你期望什麼? – JasonD 2013-02-26 07:03:33
但是當我給sizeof(int)時,系統打印4;但爲什麼這裏的指針大小變成了8 ..? – user195661 2013-02-26 07:05:27
正如一個註釋:你正在做的是正式的未定義的行爲,因爲sizeof不會產生一個'int',但你已經使用了'%d',它告訴'printf'你所傳遞的是一個INT。雖然可能沒有區別。 – 2013-02-26 07:05:42