【问题标题】:Error on realloc : corrupted size vs. prev_sizerealloc 上的错误:损坏的大小与 prev_size
【发布时间】:2018-10-31 21:25:50
【问题描述】:

我正在用 C 编写代码。 我的算法的目标是将我们在数组 str 中找到的每个字符 c 加倍。 我必须运行一些测试,第一个测试我调用doubleChar("~/fichier.txt", '~'),它工作正常,但我的第二个测试是doubleChar("une commande # commentaire", '#'),我从标题中得到错误。 当我尝试调试它时,错误出现在 realloc 行上。

在调试器中我得到这个错误:

程序接收信号 SIGABRT 堆栈跟踪可在“调用堆栈”选项卡中获得

知道为什么吗?

这是我的代码:

    char * doubleChar(const char *str, char c){
assert(str!=NULL);
    char *newString=malloc(sizeof(str) * sizeof(char));
    int a = 0;
    while(str[a] != '\0'){
        newString[a]=str[a];
        a++;
    }
    newString[a]='\0';
    int i = 0;
    while(newString[i] != '\0'){
        if(newString[i] == c){
            newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));
            for(int j=stringLength(newString)+1; j>i; j--){
                newString[j]=newString[j-1];
            }
            i++; //we add 1 to i so we don't find the char we just added
        }
        i++;
    }
    return newString;
}

【问题讨论】:

  • 这可能需要大量的重新分配。考虑doubleChar("!!!AhHa!!!", '!') 一种更快的方法是在计算匹配字符数后循环遍历字符串,然后分配空间来保存原始字符串 + 匹配数 + 1(用于终止的 nul)。在第二个循环中复制字符,同时添加重复的字符。一个 malloc,没有 reallocs。
  • 这真是个好主意!

标签: c malloc realloc sigabrt


【解决方案1】:
char *newString=malloc(sizeof(str) * sizeof(char));

由于strconst char *sizeof(str)const char * 在您的平台上占用的字节数。那不是你想要的。你想要传递给malloc 的是你想要存储的字符串的长度,确保为终止的零留下一个额外的字节。在这种情况下,就是(strlen(str) + 1)

newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));

这可能也是错误的。您需要(strlen(newString) + 2) 为新添加的字符留一个字节,为零终止符留一个字节。不过很难确定,因为我不知道你的 stringLength 函数是做什么的。

另外,sizeof(char) 根据定义是一个。 sizeof 函数返回字符大小。

strlen(newString) + 2stringLength(newString)*sizeof(char) + sizeof(char) 更容易理解,因为 strlen 是标准函数,而 sizeof(char) 冗长且丑陋。所以我强烈建议将其更改为strlen(newString) + 2

【讨论】:

  • 谢谢,您的回答很明确,确实解决了我的问题。我放 sizeof(char) 是因为我不确定平台之间是否总是 1。
  • @colin char 本身的大小可以大于 8 位,但它总是返回 sizeof char == 1。如果您需要了解 char 中的位,有一个 C 必需的宏 CHAR_BIT 它告诉你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2018-12-15
  • 2021-08-20
相关资源
最近更新 更多