2013-02-26 120 views
0
#include<stdio.h> 
int main(){ 
    int * ptr=(int *)malloc(40); 
    printf("%d",sizeof(ptr)); 
} 

當我運行這個,輸出爲8 ...這裏發生了什麼...爲什麼輸出8?有人可以解釋我在這裏發生了什麼使用malloc指針

+1

因爲這是'ptr'的大小。你期望什麼? – JasonD 2013-02-26 07:03:33

+0

但是當我給sizeof(int)時,系統打印4;但爲什麼這裏的指針大小變成了8 ..? – user195661 2013-02-26 07:05:27

+1

正如一個註釋:你正在做的是正式的未定義的行爲,因爲sizeof不會產生一個'int',但你已經使用了'%d',它告訴'printf'你所傳遞的是一個INT。雖然可能沒有區別。 – 2013-02-26 07:05:42

回答

2

malloc()返回一個指向40字節內存(可能是10個整數)的指針,並將其指定給ptrsizeof(ptr)爲8的原因是因爲您使用的是64位機器,指針大小爲8個字節。

您應該在malloc()中使用sizeof(),因爲它是良好的形式,並且可以避免問題,如果類型的大小發生變化(跨平臺或其他)。如果你真的想空間,10個整數,然後使用:

int *ptr = malloc(10 * sizeof *ptr); 

這種分配10手類型ptr點的大小,在這種情況下int。這樣做的好處是你可以改變類型而不改變malloc()

2

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

0

變量ptr編譯是int,則您的系統碰巧有8個字節大小的指針。

0

ptr是一個pointer.its在您的系統上打印指針的大小。 由於ptr保存地址,8字節是在64位機器上保存地址所需的大小。 這是編譯器特有的。你不能檢索分配給指針的大小。

如果你有這個疑問,那麼你應該也會對free()如何在不知道已經分配給指針的大小的情況下釋放內存有所疑問。

0

我已經在我的Windows 32位機器上試過這個,我得到了ans 4個字節,我認爲ptr是一個指向int的指針,顯示它的相關性

相關問題