【问题标题】:Dynamic memory allocation with char使用 char 进行动态内存分配
【发布时间】:2014-11-23 02:25:38
【问题描述】:

我只在下一个while需要时才尝试分配内存。

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() 处给了我一个 "Invalid read of size 1"

【问题讨论】:

  • str 不是0-终止的,因此strlen(str) 是未定义的行为。试试realloc(str, i+2);
  • 效率不高。您是否有上限或可能以 1k 为单位重新分配?还要避免重复使用 strlen
  • i+2 合作。谢谢!

标签: c memory malloc realloc


【解决方案1】:

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

根据文档,“如果 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);

【讨论】:

  • @idknow 是的,我错了。
  • @AlexD 你是对的。相应地更正了代码。
  • 由于某种原因仅适用于(i+2)。我还测试了你的第二个提议。
  • @idknow 是的,我犯了一个错误。
  • 我现在明白了。我试图将\0 附加到字符串中。这就是为什么我需要(i+2) 而不是(i+1)。就这么简单。
猜你喜欢
  • 2017-08-27
  • 2015-09-25
  • 1970-01-01
  • 2020-11-12
  • 2016-04-10
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多