重新分配时出错:大小与prev_size损坏

时间:2018-10-31 21:25:51

标签: c malloc realloc sigabrt

我正在用C进行编码。 我算法的目标是使我们在数组str中找到的每个字符加倍。 我必须运行一些测试,对于第一个测试,我叫doubleChar("~/fichier.txt", '~'),它工作正常,但是我的第二个测试是doubleChar("une commande # commentaire", '#'),我从标题中得到了错误。 当我尝试调试它时,错误发生在重新分配行上。

在调试器中,我收到此错误:

  

程序接收信号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;
}

1 个答案:

答案 0 :(得分:0)

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) + 2,更容易理解stringLength(newString)*sizeof(char) + sizeof(char),因为strlen是标准函数,而sizeof(char)冗长而丑陋。因此,我强烈建议将其更改为strlen(newString) + 2