我正在尝试分配内存,只有当我需要它才能用于下一个而。
char *str = malloc(sizeof(char));
int i = 0;
while(something == true){
str[i] = fgetc(fp);
str = realloc(str, strlen(str)+1);
i++;
}
free(str);
但由于某种原因,上面的代码在strlen()中给了我一个“无效读取大小为1”。
答案 0 :(得分:3)
strlen不会确定已分配的char数组的大小,即使它包含一个以空字符结尾的字符串。请参阅建议的修复,虽然我不喜欢整体的代码结构:您总是会得到一个额外的分配字符。
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);
根据文档,&#34;如果ptr是空指针,则该函数的行为类似于malloc,分配一个大小字节的新块并返回指向其开头的指针。&#34;
这是为了你不是在阅读文本而不打算使用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);