realloc 错误:损坏的大小与 prev_size
Error on realloc : corrupted size vs. prev_size
我正在用 C 编写代码。
我的算法的目标是将我们在数组 str 中找到的每个字符 c 加倍。
我必须 运行 进行一些测试,对于第一个测试,我调用 doubleChar("~/fichier.txt", '~')
并且它工作正常,但是我的第二个测试是 doubleChar("une commande # commentaire", '#')
并且我从标题中得到了错误。
当我尝试调试它时,错误出现在 realloc 行上。
在调试器中我得到这个错误:
Program Received signal SIGABRT Stack trace is available in the 'Call Stack' tab
知道为什么吗?
这是我的代码:
char * doubleChar(const char *str, char c){
assert(str!=NULL);
char *newString=malloc(sizeof(str) * sizeof(char));
int a = 0;
while(str[a] != '[=11=]'){
newString[a]=str[a];
a++;
}
newString[a]='[=11=]';
int i = 0;
while(newString[i] != '[=11=]'){
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;
}
char *newString=malloc(sizeof(str) * sizeof(char));
由于 str
是 const 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
函数 returns 字符大小。
strlen(newString) + 2
比 stringLength(newString)*sizeof(char) + sizeof(char)
更容易理解,因为 strlen
是一个标准函数,而 sizeof(char)
冗长难看。所以我强烈建议将其更改为 strlen(newString) + 2
.
我正在用 C 编写代码。
我的算法的目标是将我们在数组 str 中找到的每个字符 c 加倍。
我必须 运行 进行一些测试,对于第一个测试,我调用 doubleChar("~/fichier.txt", '~')
并且它工作正常,但是我的第二个测试是 doubleChar("une commande # commentaire", '#')
并且我从标题中得到了错误。
当我尝试调试它时,错误出现在 realloc 行上。
在调试器中我得到这个错误:
Program Received signal SIGABRT Stack trace is available in the 'Call Stack' tab
知道为什么吗?
这是我的代码:
char * doubleChar(const char *str, char c){
assert(str!=NULL);
char *newString=malloc(sizeof(str) * sizeof(char));
int a = 0;
while(str[a] != '[=11=]'){
newString[a]=str[a];
a++;
}
newString[a]='[=11=]';
int i = 0;
while(newString[i] != '[=11=]'){
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;
}
char *newString=malloc(sizeof(str) * sizeof(char));
由于 str
是 const 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
函数 returns 字符大小。
strlen(newString) + 2
比 stringLength(newString)*sizeof(char) + sizeof(char)
更容易理解,因为 strlen
是一个标准函数,而 sizeof(char)
冗长难看。所以我强烈建议将其更改为 strlen(newString) + 2
.