使用realloc时获取(核心转储)

时间:2015-08-20 09:00:31

标签: c memory-management realloc

replace("random string");

我使用像realloc这样的函数。

这里我试图增加字符串的大小,以便可以用另一个字符串替换空格。为此,我需要计算空格的数量,并获得原始字符串的长度。我能够做到这一点。

要调整大小我使用的是Aborted (core dumped),但是当我运行它时,它会提供{{1}}?

4 个答案:

答案 0 :(得分:7)

您的原始字符串是否使用malloc分配?还是realloc?也许您正在尝试增加静态字符串的大小(字符串文字):

char sStatic[256];   // cannot realloc

char *sNonStatic = NULL;   // can / must realloc

replace("random string") // cannot realloc within replace

编辑:阅读完评论后,您应该获取传入字符串的副本,增加大小,然后输出一个副本/新字符串。您不能增加常量字符串的大小(字符串文字)。

答案 1 :(得分:5)

唯一可以传递给realloc的指针是空指针以及之前由callocmallocrealloc返回的指针!

这很重要,因为你提到你调用了像replace("random string")这样的函数... "random string"是空指针,还是由其中一个*alloc函数返回?不。也许您打算使用strdup或其他内容(例如char *foo = strdup("random string"); replace(foo); free(foo);)? strdup是POSIX函数(例如,不像*alloc函数那样的C标准),但应该返回*alloc函数返回的内容。

遵循以下代码:

unsigned int new_len = len + 2 * no_of_spaces;
str = (char*) realloc(str, new_len * sizeof(char)); /* NOTE there's a potential memory leak
                                                     * when realloc returns NULL here, though
                                                     * that's the least of your problems */

...您必须检查str以确保realloc成功,并且只有str的唯一有效索引介于0和new_len - 1 。这是空指针取消引用或缓冲区溢出:

str[new_len] = '\0';

也许你的意思如下:

size_t new_len = len + 2 * no_of_spaces;
void *temp = realloc(str, new_len + 1); /* <--- NOTE +1 HERE! */
if (temp == NULL) {
    /* XXX: Bomb out due to allocation failure */
}
str = temp;

...现在有效索引介于0和new_len + 1 - 1之间,所以这是有效的:

str[new_len] = '\0';

答案 2 :(得分:1)

此行不正确,因为有效索引的范围为0 .. new_len - 1

str[new_len] = '\0';

应该是:

str[new_len - 1] = '\0';

您还有其他一些潜在问题:

  • realloc可以返回NULL - 你应该检查这个

  • 如果realloc失败,你会失去原来的str指针并导致内存泄漏 - 你应该使用一个临时指针来测试结果,测试这个为NULL,然后只有当realloc成功时你应该将str设置为等于temp:

char * temp = realloc(str, new_len);
if (temp == NULL)
{
    // handle error here...
}
else
{
    str = temp; // success...
    str[new_len - 1] = '\0';
}
  • 不是这样的错误,但是你有很多不必要的强制转换,它们有潜在危险,因为它们可以掩盖可能会产生编译器错误或警告的错误。您可以安全地删除上面代码中的所有强制转换。

答案 3 :(得分:0)

您还可以移动指针

while (*str) {
    if ((char)*str == SPACE)
        no_of_spaces++;
    str++;
    len++;
}

当你到最后,你试图重新分配它。但是你已经远离了数组所在的位置。在这里使用临时变量。 正如其他人所说。希望使用malloc创建字符串,而不是数组。

并且str[new_len] = '\0';超出范围。