我想分配内存只有当我需要它为下一个而。带字符的动态内存分配
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的()。
我想分配内存只有当我需要它为下一个而。带字符的动态内存分配
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的()。
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);
@AlexD与(1 + 2)一起工作。 – Christopher 2014-11-23 02:34:48
@idknow是的,我错了。 – Tarik 2014-11-23 02:36:33
@AlexD你是对的。抱歉! – Tarik 2014-11-23 02:37:45
'str'不是'0 ' - 终止,因此'strlen(str)'是未定义的行为。试试'realloc(str,i + 2);'。 – AlexD 2014-11-23 02:27:16
效率不高。你有一个上限或可能重新分配一个1k块?还避免重复使用strlen – 2014-11-23 02:32:09
使用'i + 2'。谢谢! – Christopher 2014-11-23 02:37:15