我正在尝试使用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?
答案 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失败了......