-2

我的程序在以下一段 od 代码上崩溃:

  newElement->name = (char*) malloc((strlen(name) + 1) * sizeof(char));

通过使用调试器,我得到 SIGABRT 错误,我不知道为什么,因为它在第二次迭代期间停止(第一次迭代没有任何问题)。

我检查了是否

  name

有一个终止的空字符,它有。

这是完整的代码:

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;

}

4

3 回答 3

0

http://linux.die.net/man/3/malloc

如果 MALLOC_CHECK_ 设置为 0,任何检测到的堆损坏都会被静默忽略;如果设置为 1,则在 stderr 上打印诊断消息;如果设置为 2,则立即调用 abort(3);如果设置为 3,则在 stderr 上打印诊断消息并中止程序。

所以你得到一个 SIGABRT 因为你将 MALLOC_CHECK_ 设置为 2 或 3。如果它是 2,将其更改为 3 以获取诊断消息。

于 2013-04-15T00:17:05.597 回答
0

您正在尝试 malloc 由表达式给出的特定部分内存:

(strlen(name) + 1) * sizeof(char)

可能您的问题出在 strlen(name) 部分。也许 name 没有以 null 结尾的字符串,因此 strlen 不起作用。

正如评论中所指出的,malloc 本身不应该创建和堆溢出,但是,如果它检测到一些内部数据损坏,它可能确实会调用 abort(),这些损坏可能是并且可能是由堆溢出、缓冲区溢出或泄漏引起的在与此代码不直接相关的代码的任何其他部分。这里重要的是:这个 malloc 调用是否返回?还是它在执行期间发送信号?

如果它没有返回并且它在执行期间发送 SIGABRT 你可能很难弄清楚你的程序中的哪些地方损坏了 malloc 所需的数据结构......如果你说你执行的第一个 malloc 调用没问题,也许你应该看看在两者之间执行了什么代码,但我相信你不能确定两个 malloc 调用之间发生的损坏,malloc 可能根本看不到第一次执行时的损坏原因...

于 2013-04-14T23:39:10.970 回答
0

您的代码本身就很好。

sigabort可能是堆溢出导致的,即您的malloc.

于 2013-04-14T23:38:12.680 回答