2014-11-23 88 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