【问题标题】:SIGABRT error during alllocation of char array [closed]分配char数组期间的SIGABRT错误[关闭]
【发布时间】:2013-04-14 23:33:22
【问题描述】:

我的程序在以下一段 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;

}

【问题讨论】:

  • 您希望这里的任何人对此做些什么? name 无效,因此它在 strlen 中崩溃,或者 malloc 竞技场已损坏,因此它在那里崩溃,或者 newElement 无效,因此当您取消引用它时它崩溃......我们没有办法知道,因为你提供的信息太少了。
  • "Here is whole code" -- 整个代码至少包括调用者和元素的定义。请提供 SSCCE (sscce.org)。

标签: c memory-management


【解决方案1】:

来自

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

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

因此,您将获得 SIGABRT,因为您将 MALLOC_CHECK_ 设置为 2 或 3。如果是 2,请将其更改为 3 以获取诊断消息。

【讨论】:

    【解决方案2】:

    您的代码本身完全没问题。

    sigabort 可能是堆溢出导致的,即您的malloc 内存不足。

    【讨论】:

    • 但是当我的 malloc 内存不足时,它不应该给我一个 NULL 指针吗?
    • 这是第二个提到“堆溢出”的“答案”,但没有这回事。如果堆耗尽,malloc 将返回 NULL。
    • @Supermartzin 请参阅我在您的问题下的评论,了解获得 SIGABRT 的三个可能原因。您在调试器下运行,您可以弄清楚是哪一个……我们所能做的就是猜测。
    【解决方案3】:

    你正试图 malloc 由表达式给出的特定部分内存:

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

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

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

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

    【讨论】:

    • 将太大的值传递给malloc 将导致它返回 NULL,而不是产生 SIGABRT。有关可能的原因,请参阅我上面的评论。
    • 它确实返回 null 并且确实调用了发送 SIGABRT 的 abort()。 (stackoverflow.com/questions/3413166/…)
    • “例如,如果 malloc() 的内部结构被堆溢出损坏,则 malloc() 将调用 abort()”这意味着 malloc() 可能由于内部结构损坏而间接发送和 SIGABRT,因此因此,如果 SIGABRT 在 malloc 指令之后发送,这可能是原因。
    • 你只是在重复自己(或者更确切地说是别人),而没有注意我写的内容。 “SIGABRT 在 malloc 指令之后发送”——malloc 不是“指令”。 SIGABRT 将发生在 inside malloc,而不是“之后”...但是以较大的值调用 malloc 不是损坏
    • -_-' 我注意到我所说的确实是真的。 malloc 可能由于某种原因与堆溢出有关(如果您愿意,内部数据结构损坏)间接发送 SIGABRT,因此 malloc 可能是 SIGABRT 的原因。这就是我所说的......而且没有人告诉我 malloc 甚至返回......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多