在char数组分配期间出现SIGABRT错误

时间:2013-04-14 23:33:23

标签: c memory-management

我的程序崩溃了下面的代码:

  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;

}

3 个答案:

答案 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以获得诊断信息。