malloc()的奇怪行为

时间:2015-08-19 09:05:21

标签: c linux pointers malloc embedded-linux

我有以下代码:

if ((ptCurEntry->pNext = (TISOMStscBoxEntry *) malloc(sizeof(TISOMStscBoxEntry))) == NULL)
{
    return ERR_OUT_OF_MEMORY;
}
ptCurEntry->pNext->pNext = NULL;

我malloc一个大小为TISOMStscBoxEntry的空间。 在此结构中,包含指针 pNext 。 在正常情况下,ptCurEntry->pNext->pNext = NULL正在运行。 (只需为创建的指针指定NULL) 但是,当系统忙时,我遇到了由ptCurEntry->pNext->pNext = NULL引起的分段错误。 似乎上面对malloc的错误处理很好,它有什么问题? 也许我不能依赖于malloc的返回NULL?

2 个答案:

答案 0 :(得分:2)

要检查的事项

  • ptCurEntry指向有效对象。如果不是这样,访问ptCurEntry->pNext将给出未定义的行为;
  • ptCurEntry->pNext实际上是指向TISOMStscBoxEntry的指针。如果不是这样,则可能没有足够的内存分配。
  • 在致电malloc()之前,<stdlib.h>已包含在内。如果不这样做,可能会导致指针取消引用具有未定义的行为。

另外,更改

if ((ptCurEntry->pNext = (TISOMStscBoxEntry *) malloc(sizeof(TISOMStscBoxEntry))) == NULL)

if ((ptCurEntry->pNext = malloc(sizeof(*(ptCurEntry->pNext)))) == NULL)

这解决了上面要检查的一些问题。如果它不编译,则意味着要么省略了#include <stdlib.h>,要么你的编译器是C ++编译器而不是C编译器。

我假设您的代码不是多线程的。

答案 1 :(得分:0)

如果您的应用程序已经造成任何内存损坏,则malloc可能会出现异常或生成核心。因此,请确保使用valgrind或类似工具没有无效的读/写