C语言 使用 char 进行动态内存分配



我尝试仅在接下来需要时才分配内存。

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的无效读取"。

>strlen 不会确定分配的 char 数组的大小,即使它包含以 null 结尾的字符串。请参阅建议的修复程序,尽管我总体上不喜欢代码结构:您最终将始终获得一个额外的分配字符。

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)]=''; <-- 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)]=''; <-- Add this if you want a null terminated string
free(str);

相关内容

  • 没有找到相关文章

最新更新