【发布时间】:2020-06-06 01:53:24
【问题描述】:
我遇到了一个无法识别的分段错误。
我的错误函数接收到一个字符串text。它应该将其转换为 document 并返回。 document 由 paragraphs(由 '\n' 分隔)组成,sentences(由 '.' 分隔)由words(由 ' ' 分隔)。您可以参考完整的问题陈述here。
这是我的代码的相关部分:
char**** get_document(char* text) {
int p = 0, s = 0, w = 0, c = 0;
char**** document;
document = malloc(sizeof(char***));
document[0] = malloc(sizeof(char**));
document[0][0] = malloc(sizeof(char*));
document[0][0][0] = malloc(sizeof(char));
while (*text)
{
if (*text == ' ')
{
c = 0;
++w;
document[p][s] = realloc(document[p][s], sizeof(char*) * (w + 1));
}
else if (*text == '.')
{
c = 0;
w = 0;
++s;
document[p] = realloc(document[p], sizeof(char**) * (s + 1));
}
else if (*text == '\n')
{
c = 0;
w = 0;
s = 0;
++p;
document = realloc(document, sizeof(char***) * (p + 1));
}
else
{
++c;
document[p][s][w] = realloc(document[p][s][w], sizeof(char) * (c + 1));
document[p][s][w][c - 1] = *text;
document[p][s][w][c] = '\0';
}
++text;
}
return document;
}
调试后才知道程序崩溃的时候
w = 1document[p][s][w][c - 1] = *text;
我不知道为什么会这样。我在执行该语句之前检查了 p、s、w 和 c 的值,以及 realloc 语句是否正确执行。
但徒劳无功!
我的代码可能出了什么问题?
【问题讨论】:
-
有很多星号。您确定问题需要这种程度的指针间接吗?此外,
sizeof(char*)、sizeof(char**)和sizeof(char***)的大小应该相同。 -
@RobertHarvey 输出必须是
char****才能完成任务 -
好吧,this 说 realloc “重新分配给定的内存区域。它必须先前由 malloc()、calloc() 或 realloc() 分配,并且尚未使用调用 free 或 realloc。否则,结果未定义。"
-
好吧,根据this,您的方法应该有效。 “如果 ptr 是空指针,该函数的行为类似于 malloc,分配一个新的 size 字节块并返回一个指向其开头的指针。”
-
尝试通过 valgrind 运行您的代码。如果你的内存管理不善,它会告诉你在哪里。
标签: c pointers debugging segmentation-fault