c - realloc:invalid next size 错误,谁能指出我在内存分配中犯的错误
问题描述
我传递给get_document函数的文本是普通的字符串数据。
1." "表示分词。
2."." 表示句子的分离。
3."\n" 表示段落的分隔。
get_document是一个函数,它为单独的内存块分配每个单词、句子、段落,使其易于访问。这是代码片段。
char**** get_document(char* text) {
//get_document
int l=0,k=0,j=0,i=0;
char**** document = (char****)malloc(sizeof(char***));//para
document[l] = (char***)malloc(sizeof(char**));//sen
document[l][k] = (char**)malloc(sizeof(char*));//word
document[l][k][j] = (char*)malloc(sizeof(char));//letter
for(int z = 0; z < strlen(text); z++) {
if(strcmp(&text[z]," ")==0) {
document[l][k][j][i] = '\0';
j++;
document[l][k] = realloc(document[l][k],(sizeof(char*)) * j+1);
i=0;
document[l][k][j] = (char*)malloc(sizeof(char));
}
else if(strcmp(&text[z],".")==0) {
k++;
document[l] = realloc(document[l],(sizeof(char**)) * k+1);
j=0;
i=0;
document[l][k] =(char**)malloc(sizeof(char*));
document[l][k][j] = (char*)malloc(sizeof(char));
}
else if(strcmp(&text[z],"\n")==0) {
l++;
document = realloc(document,(sizeof(char***)) * l+1);
k=0;
j=0;
i=0;
document[l] = (char***)malloc(sizeof(char**));
document[l][k] =(char**)malloc(sizeof(char*));
document[l][k][j] = (char*)malloc(sizeof(char));
}
else {
strcpy(&document[l][k][j][i],&text[z]);
i++;
document[l][k][j] = realloc(document[l][k][j],(sizeof(char)) * i+1);
}
}
return document;
}
但是当我运行程序时,我得到了错误
realloc:下一个大小无效
谁能帮我这个。提前致谢。
解决方案
当我运行程序时,我得到了错误
realloc:下一个大小无效
realloc
由于分配器的跟踪数据已损坏,您的一个调用似乎失败了。当您覆盖对象的边界时,这是最常见的错误之一,尤其是分配的边界。你做的很多:
strcpy(&document[l][k][j][i],&text[z]);
如果您想在 C 的学习中取得任何进展,您必须了解 achar
和字符串之间的区别。C 字符串函数,例如strcmp()
and strcpy()
,仅适用于后者。您可以将它们用于空字符串(仅包含一个 nul)或单字符串(包含一个字符加一个 nul)等等,但它们对单个char
s 既不安全也不有用。对于单个char
s,您将使用标准 C 运算符,例如==
and =
。
在上面引用的行的情况下,每次strcpy
调用都会尝试将输入字符串的整个尾部(包括终止符)复制到char
指向的大空间中&document[l][k][j][i]
。 这将始终写入超过分配空间的末尾,通常很多,从而产生未定义的行为。 你似乎想要:
document[l][k][j][i] = text[z];
(当之无愧的批评选择一个四重指针放在一边)。我看到您留下一个字符串终止符以供以后使用,原则上这是可以的,但我也看到如果句点 ( '.'
) 紧跟在单词后面而没有任何空格,则您无法终止每个句子的最后一个单词。
同样,您对strcmp()
每个的多次使用将输入字符串的整个尾部与几个长度为一的字符串文字之一进行比较。允许进行此类比较,但它们不会产生您想要的结果。看来您想要对字符常量进行简单的相等测试,而不是:
if (text[z] == ' ')
// ...
else if (text[z] == '.')
// ...
else if (text[z] == '\n')
当然,即使进行了这些更正,您的方法仍然非常低效。内存 [重新] 分配相对昂贵,并且您正在为每个执行分配或重新分配。单身的。特点。在文档中。 至少提前扫描到每个单词的末尾,以便一次分配一个单词,尽管甚至可以做得更好。
此外,不要忽视malloc()
andrealloc()
可能会失败的事实,在这种情况下它们会返回一个空指针。健壮的代码会一丝不苟地检查和处理来自其函数调用的错误结果,包括分配错误。
推荐阅读
- json - 将名称包含空格或特殊字符的 json 字段与 Jsonata 匹配
- permissions - IOS14、IpadOS14、tvOS14、AppStore 中的新用户权限需要跟踪吗?
- symfony - 在 SonataAdmin 中使用 ModelListType 与我们的关系
- python - 如何有效地从大型数据集中获取指定窗口内数据的平均值?
- django - Django OneToOne 字段 - 没有对 AUTH_USER_MODEL 的反向访问器
- css - CSS 切换 bootstrap-vue 卡全屏
- c# - 在正文中发送 json 以进行 API 后期测试
- html - 使用 ActionLink 将目录的值从锚标记传递到控制器
- mysql - Mysql经常关机/重启
- python - 我可以解析 PDF 文件以进行抓取吗?