使用char进行动态内存分配

时间:2014-11-23 02:25:38

标签: c memory malloc realloc

我正在尝试分配内存,只有当我需要它才能用于下一个

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”

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);