2字节的Malloc会产生问题

时间:2009-05-13 01:07:58

标签: c memory-management malloc

我正在尝试使用short的malloc,比如

typedef union _SOME_STRUCT_ {

   struct {

     USHORT u:4;
     USHORT v:4;
     USHORT w:4;

   } x;

   USHORT word;

} SOME_STRUCT, *PSOME_STRUCT;

PSOME_STRUCT p = malloc (sizeof (SOME_STRUCT));

if (p) {

    p->x.u = 0;
}

free (p); // **** RANDOMLY CRASHING HERE ****

我正在调试几天而且一无所知,

注释(已编辑):Linux和gcc版本3.4.6 20060404


使用VALGRIND找到问题

但是,我想在此记录,以便我的开发人员可能会意识到这种情况......

我实际上已将结构定义为

typedef union _SOME_STRUCT_ {

   struct {

     USHORT u:4;
     USHORT v:4;
     USHORT w:4;

   } x;

   USHORT word;

} ALBUM, *PALBUM;

以及我已经定义的代码中的其他地方

#define ALBUM "album"

因此,sizeof(ALBUM)指的是#define值而不是typedef,因此是问题。

令我惊讶的是,

这是否允许在C?


8 个答案:

答案 0 :(得分:3)

尝试通过valgrind传递您的程序,这是一个开源程序并且完全免费,也许它可以帮助您查看问题所在。不要忘记使用调试符号进行编译:gcc -g [etc]。

希望这有帮助..

答案 1 :(得分:3)

此版本的代码适用于我。

#include <stdio.h>
#define USHORT unsigned short

typedef union _SOME_STRUCT_ {
    struct {
        USHORT u:4;
        USHORT v:4;
        USHORT w:4;
    } x;
    USHORT word;
} SOME_STRUCT, *PSOME_STRUCT;

int
main(int c, char *argv[])
{
    PSOME_STRUCT p = malloc (sizeof (SOME_STRUCT));

    if (p) {
        p->x.u = 0;
    }

    free (p); // **** Properly exiting after this ****
}

这是Windows XP上Cygwin的GDB调试。

(gdb) p/x sizeof(PSOME_STRUCT)
$1 = 0x4
(gdb) p/x sizeof(p)
$2 = 0x4
(gdb) p/x sizeof(*p)
$3 = 0x2
(gdb) n
23              if (p) {
(gdb) p/x *p
$4 = {x = {u = 0xc, v = 0x4, w = 0x3}, word = 0x534c}

忽略$ 4中的值,数据未初始化。 程序正常退出。

除了这些行之外,你在代码中还有别的东西吗?

编辑:和,免费(0);是一个有效的操作。

答案 2 :(得分:2)

可能是对齐问题。如果你做这样的事情,它仍会崩溃:

   struct {
     USHORT u:4;
     USHORT v:4;
     USHORT w:4;
     USHORT  :4;
   } x;

答案 3 :(得分:2)

问题不在于代码,而是在另一个线程之前或之中发生的事情。

我会减少程序的各个部分,直到它停止崩溃,然后逐步添加它,直到你找出导致这个的部分。根据操作系统/平台,您还可以尝试一些内存检查工具,valgrind / _crtdebug等。

答案 4 :(得分:1)

如果您可以调试此问题,可以通过调用memcheck启动调试会话。

内存崩溃的原因通常是堆积或释放相同的指针两次。

答案 5 :(得分:1)

你无条件地调用free()而不检查malloc是否成功,所以如果malloc失败并且p是一个NULL指针,那么你正在调用free(NULL)。

将if(p)块内的空闲移动。

这可能不是导致崩溃的原因,如果不是内存限制,则不应该这样,但是仍然是一个错误。

稍后添加:根据http://www.opengroup.org/onlinepubs/009695399/functions/free.html明确允许doh,free(NULL) - 抱歉。

答案 6 :(得分:1)

如果你在malloc和free之间进行操作,你可能会意外地超越一个不同的阵列并破坏你自己的堆栈

(如果'p'不是恰好在寄存器中,并且你超出静态分配的数组并且在堆栈中存储'p'的位置,那么稍后你将尝试释放随机废话,因此,段错误

答案 7 :(得分:0)

如果你将if(p)放入if中怎么办?也许(不太可能)malloc失败了......