我的程序崩溃了下面的代码:
newElement->name = (char*) malloc((strlen(name) + 1) * sizeof(char));
通过使用调试器我得到SIGABRT错误,我不知道为什么,因为它在第二次迭代期间停止(第一次迭代没有任何问题)。
我检查了
name
有一个treminating null字符,它有。
这是完整的代码:
element* createElement(const char* name, const char* text) {
if (name == NULL) return NULL;
element* newElement = malloc(sizeof(element));
if (newElement == NULL) return NULL;
newElement->name = (char*) malloc((strlen(name) + 1) * sizeof(char));
if (newElement->name == NULL) return NULL;
strcpy(newElement->name, name);
if (text == NULL) newElement->text = NULL;
else
{
newElement->text = malloc((strlen(text) + 1) * sizeof(char));
if (newElement->text == NULL) return NULL;
strcpy(newElement->text, text);
}
newElement->parentNode = NULL;
newElement->previousSibling = NULL;
newElement->nextSibling = NULL;
newElement->firstChild = NULL;
newElement->lastChild = NULL;
return newElement;
}
答案 0 :(得分:0)
你的代码本身就很好。
sigabort
可能是因为堆溢出造成的,即malloc
内存不足。
答案 1 :(得分:0)
你正在尝试使用表达式给出的某个部分内存:
(strlen(name) + 1) * sizeof(char)
可能你的问题在于strlen(name)部分。 也许name没有空终止字符串,因此strlen不起作用。
正如注释中指出的那样,malloc本身不应该创建和堆溢出但是,如果它检测到一些内部数据损坏,它可能确实会调用abort(),这可能并且可能是由堆溢出引起的,缓冲区溢出或代码的任何其他部分中的泄漏与此代码没有直接关系。这里重要的是:这个malloc调用是否返回?还是在执行期间发送信号?
如果它没有返回并且它在执行期间发送了SIGABRT,那么你可能很难找到程序中哪些地方已经破坏了malloc所需的数据结构...如果你说的是第一个malloc调用你执行没有问题也许你应该看看中间执行了什么代码,但我相信你不能确定两个malloc调用之间发生的腐败,malloc可能根本就没有看到腐败因各种原因执行......
答案 2 :(得分:0)
这
http://linux.die.net/man/3/malloc
如果MALLOC_CHECK_设置为0,则检测到任何堆损坏 默默地忽略;如果设置为1,则打印诊断消息 标准错误;如果设置为2,则立即调用abort(3);如果设置为3,a 诊断消息打印在stderr上,程序中止。
所以你得到一个SIGABRT,因为你把MALLOC_CHECK_设置为2或3.如果是2,将它改为3以获得诊断信息。