2012-04-13 35 views
2

嘿,我有問題在malloc中使用sizeof運算符。例如參見下面的表格。代碼 -malloc(sizeof(s))分配的內存少於預期?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
char * copy(char *s) 
{ 
    char *t=malloc(sizeof(s)); 
    char *ptr=s; 
    int i=0; 
    do 
    { 
     t[i++]=*ptr++; 
    } 
    while(*ptr!='\0'); 
    return t; 
} 
int main() 
{ 
    char *s="hello adsjahsjkdhjkashdkjaskdasldjlasjdlajsdlkjaslkdjalsjdlasjdljasdljasdkljklsdjlasdsadasdasd"; 
    char *b=copy(s); 
    printf("%s\n",b); 
    free(b); 
    return 0; 
} 

上ideone,它給人的錯誤: - * glibc的檢測 ./prog:免費():無效的下一個尺寸(快速):0x09bcf008 * *

但是,當我用malloc(strlen(s)+1)替換malloc(sizeof(s)),程序完美運行。所以有什麼問題? 注意:這只是我創建的一個小程序,用於演示我在另一個代碼中遇到的問題。

+0

如果'malloc' * ever *的分配小於請求的(除非* none *在這種情況下它將返回NULL),那麼你在實現中發現了一個錯誤 - - 恭喜! – 2012-04-13 21:22:06

回答

6

運算符sizeof不會在指針上做你想要的。它會產生你機器上指針的大小(這將是4或8)。

你可以這樣想:當傳遞給一個函數時,數組衰減爲一個指針,並且關於它的大小的信息是「丟失」的。


另請注意,您的循環未填充0終止符。

+0

@downvoter你可以提出一個改進? – cnicutar 2012-04-14 07:24:09

6

你應該在copy功能使用strlen代替sizeof

char * copy(char *s) 
{ 
    char *t=malloc(strlen(s) + 1); 
    char *ptr=s; 
    int i=0; 
    do 
    { 
     t[i++]=*ptr++; 
    } 
    while(*ptr!='\0'); 
    return t; 
} 

的問題是,sizeof不會返回所需的值,該函數將返回的char *s(大概4個或8的尺寸 - >字節用於存儲該指針)。檢查文檔鏈接以更清楚地理解。

還有一件事,如果你這樣做是爲了練習你的C語言技能是好的,但如果你不是,你很可能只想使用strcpy函數。

希望它有幫助。

+2

仍然不夠......'strlen'不包括空終止符。 – dmckee 2012-04-13 21:16:47

+0

你是對的,編輯。謝謝@dmckee! – 2012-04-13 21:19:45

+0

2 @downvoters,請提出改進​​建議....爲什麼這個問題還沒有選擇答案? – 2012-04-14 15:04:32

4

陣列或大小的信息串被退化爲指針丟失,當它被作爲參數傳遞給函數

所以,當你計算參數的大小的大小屬性s基於它要麼返回32/64在你的位置上。

而不是sizeof,你應該實際上做strlen並添加一個以容納空字符。的

代替

char *t=malloc(sizeof(s)); 

嘗試

char *t=malloc(strlen(s)+1); 

請注意:

還有其他的設計問題與您的代碼

  1. 當指針傳遞參數,它是不是蘇應該改變,你應該聲明它是const。

  2. 一般情況下,返回本地生成的堆存儲的地址不是一個好的做法,並且是導致內存泄漏的主要原因,如果calle lee永遠忘記釋放存儲。而是將其作爲非常量參數傳遞給該函數。

+0

Anonymous Downvoter澄清 – Abhijit 2012-04-14 06:04:27

4

sizeof(s)返回char *s其尺寸爲4(在32位)或8(在64位)系統。

1

sizeof返回指針的大小(通常爲4或8字節),而不是指向對象的大小。 (沒有辦法讓在後者的信息sizeof是有效編譯時間常數,順便。)

1

s是爲char一個指針,所以malloc(sizeof(s))分配用於一個字符指針空間 - 通常爲2 -8個字節,最常見的是4個字節。就目前而言,無論您傳入的字符串的長度如何,它都會分配這個固定的空間量。在測試中,您傳遞的字符串比這個長得多,所以會溢出您分配的緩衝區。

你已經給出了正確的答案:在這種情況下,strlen是找到尺寸的正確功能。

0

malloc在聲明中,所以我們在調用malloc的任何程序中#include該頭文件。根據定義,C中的「byte」是一個適合存儲一個字符的存儲量,所以上面的malloc調用給我們提供了和我們要求的一樣多的字符。我們可以舉例說明這樣的結果:

+0

like:???我想你錯過了在那裏放置一些代碼。 – 2014-02-03 06:59:09