2014-11-23 128 views
0

我想分配內存只有當我需要它爲下一個帶字符的動態內存分配

char *str = malloc(sizeof(char)); 
int i = 0; 

while(something == true){ 
    str[i] = fgetc(fp); 
    str = realloc(str, strlen(str)+1); 
    i++; 
} 

free(str); 

但由於某些原因上面的代碼給我的「大小1的無效讀」在strlen的()。

+3

'str'不是'0 ' - 終止,因此'strlen(str)'是未定義的行爲。試試'realloc(str,i + 2);'。 – AlexD 2014-11-23 02:27:16

+1

效率不高。你有一個上限或可能重新分配一個1k塊?還避免重複使用strlen – 2014-11-23 02:32:09

+0

使用'i + 2'。謝謝! – Christopher 2014-11-23 02:37:15

回答

3

strlen不會確定分配的字符數組的大小,即使它包含以空字符結尾的字符串。儘管我不喜歡整體的代碼結構,但請參閱建議的修補程序:您總是會得到一個額外分配的字符。

char *str = malloc(sizeof(char)); 
int i = 0; 

while(something == true){ 
    str[i] = fgetc(fp); 
    str = realloc(str, (i+2)*sizeof(char)); 
    i++; 
} 
// str[i*sizeof(char)]='\0'; <-- Add this if you want a null terminated string 

free(str); 

我會提出下面的代碼將避免分配額外的字符:

char *str = NULL; 
int i = 0; 

while(something == true){ 
    str = realloc(str, (i+1)*sizeof(char)); 
    str[i] = fgetc(fp); 
    i++; 
} 

free(str); 

按照文件,「如果這ptr爲空指針,該函數的行爲類似的malloc,分配新的字節大小的塊,並返回一個指向其開始的指針。「

這是你不讀文本和不打算使用這些功能的strlen,strcat的情況下...

組塊在時間分配:

char *str = malloc(sizeof(char)); 
int i = 0; 
const int chunk_size = 100; 

while(something == true){ 
    str[i] = fgetc(fp); 
    if (i % chunk_size == 0) 
     str = realloc(str, (i+1+chunk_size)*sizeof(char)); 
    i++; 
} 
// str[i*sizeof(char)]='\0'; <-- Add this if you want a null terminated string 

free(str); 
+0

@AlexD與(1 + 2)一起工作。 – Christopher 2014-11-23 02:34:48

+0

@idknow是的,我錯了。 – Tarik 2014-11-23 02:36:33

+0

@AlexD你是對的。抱歉! – Tarik 2014-11-23 02:37:45