关于malloc和free的问题

zhuang094 2002-07-08 02:38:19
各位大侠:小弟遇到这样一个问题,一时想不明白,请大家指点。
我定义了一个struct (MY_STRUCT),然后定义了一个全局数组:MY_STRUCT g_pStructs[100],并且初始化时已将这些g_pStructs置为NULL,
现在我在程序中g_pStructs[1] = (MY_STRUCT)malloc(sizeof(MY_STRUCT)),但在释放时出错:free(g_pStructs[1]).
...全文
147 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuang094 2002-07-15
  • 打赏
  • 举报
回复
楼上的众兄弟们,不好意思,是我的愚蠢导致了这个结果。我在分配内存时不小心造成的,与枚举类型变量无关。
非常感谢各位帮忙。现在结帖。
oldevil 2002-07-15
  • 打赏
  • 举报
回复
我试过,没有问题
enum BBB{HHH,KKK};
typedef struct {
enum BBB eb;
int a,b,c;
}AAA;
int main(int argc, char* argv[])
{
AAA *pa=(AAA*)malloc(sizeof(AAA));
pa->eb = KKK;
pa->a = 1;
free(pa);
return 0;
}
verybigbug 2002-07-15
  • 打赏
  • 举报
回复
枚举类型?
如果赋值不对会引起内存问题,free就有问题。
比如:
enum AAA{
tt0 = 0,
tt1
}

struct BBB{
int a;
AAA b;
}

BBB * c = malloc(sizeof(BBB));
c->b = tt0;
free(c); OK

c->b = 0;
free(c); // 有可能有问题。

因为编译器有可能进行优化,将AAA作为1BYTE,但是在
c->b=0;时将AAA作为DWORD(4BYTE)造成内存问题。

zhuang094 2002-07-15
  • 打赏
  • 举报
回复
to:cywater2000(如果)
不会,我是用枚举值进行赋值的。
更奇怪的是,我定义的两个枚举类型变量,对第二个进行赋值则不出错。
typedef struct{
long l;
MY_ENUM e1;
MY_ENUM e2;
}MY_STRUCT;
对e1赋值则free出错,对e2赋值则不出错。


另外,因为是底层开发,规定采用c,因此我不能用new和delete.
cywater2000 2002-07-15
  • 打赏
  • 举报
回复
是不是赋错值了?不是枚举内的范围???
还有,我建议你使用C++的new和delete
zhuang094 2002-07-15
  • 打赏
  • 举报
回复
我找到了出错地方:我的结构中定义了一个枚举类型的成员变量。
在操作中如果我对该成员变量进行赋值,则free()出错!
如果我将对该成员的赋值这一行去掉,则free不出错!
这个试过了多次。

是不是枚举类型的冬冬有bug?
zhuang094 2002-07-08
  • 打赏
  • 举报
回复
请各位大侠指点一二吧。
zhuang094 2002-07-08
  • 打赏
  • 举报
回复
to: sammon(努力学习)
在我的程序中还用到许多的结构(包括全局结构指针数组),都是这样定义的,但它们的使用(malloc和free)都没出错。同样的方式使用,却不同的结果,使我更加不明白。
jmcooler 2002-07-08
  • 打赏
  • 举报
回复
你好好的检查你的程序,这是点基本的C,估计你细心一点就没事的。
我现在也说不上你的问题出在哪儿。
签名:jmcooler
zhuang094 2002-07-08
  • 打赏
  • 举报
回复
还有,情况是这样的:如果我malloc,又直接free,试过多次都不出错。
但是我在malloc后,对结构对象的成员做了些操作,再free就不行了。
我想不明白的是,这些成员只是一些int、long或枚举类型的,没有道理影响到free操作啊。
sammon 2002-07-08
  • 打赏
  • 举报
回复
c中声明struct类型时,必须要加上struct yourstruct m_yourstruct
或者定义结构时用typedef MY_STRUCT* LPMYSTRUCT;
c++中就不需要这样直接用struct yourstruct;
yourstruct m_yourstruct;
原因....且听下回分解
zhuang094 2002-07-08
  • 打赏
  • 举报
回复
对不起,是一个指针类型的,忘了写*,其实我在程序中是这样的:
typedef struct{
...
}MY_STRUCT,*PMY_SYRUCT;
定义数组:PMY_STRUCT g_pStructs[100].
jmcooler 2002-07-08
  • 打赏
  • 举报
回复
应该是:
typedef MY_STRUCT* LPMYSTRUCT;


LPMYSTRUCT g_pStructs[100];
g_pStructs[0] = (LPMYSTRUCT)malloc( sizeof(MY_STRUCT) );
//..........
free( g_pStructs[0] );
签名:jmcooler
jmcooler 2002-07-08
  • 打赏
  • 举报
回复
你的C语言都有些问题,注意到, malloc( sizeof(MY_STRUCT) )的结果是得到了一个MY_STRUCT的指针,而不是MY_STRUCT对象本身,所以你再将这个指针强制转换为MY_STRUCT十分不妥,但编译是可以通过的。
你的用意是建立一个数组,其中每个单元存放一个MY_STRUCT指针,这在C语言里叫做指针数组,即是保存指针的数组。
签名:jmcooler

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧