各位大侠:小弟遇到这样一个问题,一时想不明白,请大家指点。
我定义了一个struct (MY_STRUCT),然后定义了一个全局数组:MY_STRUCT g_pStructs[100],并且初始化时已将这些g_pStructs置为NULL,
现在我在程序中g_pStructs[1] = (MY_STRUCT)malloc(sizeof(MY_STRUCT)),但在释放时出错:free(g_pStructs[1]).

解决方案 »

  1.   

    你的C语言都有些问题,注意到, malloc( sizeof(MY_STRUCT) )的结果是得到了一个MY_STRUCT的指针,而不是MY_STRUCT对象本身,所以你再将这个指针强制转换为MY_STRUCT十分不妥,但编译是可以通过的。
    你的用意是建立一个数组,其中每个单元存放一个MY_STRUCT指针,这在C语言里叫做指针数组,即是保存指针的数组。
    签名:jmcooler
      

  2.   

    应该是:
    typedef  MY_STRUCT*  LPMYSTRUCT;
    LPMYSTRUCT g_pStructs[100];
    g_pStructs[0] = (LPMYSTRUCT)malloc( sizeof(MY_STRUCT) );
    //..........
    free( g_pStructs[0] );
    签名:jmcooler
      

  3.   

    对不起,是一个指针类型的,忘了写*,其实我在程序中是这样的:
    typedef struct{
    ...
    }MY_STRUCT,*PMY_SYRUCT;
    定义数组:PMY_STRUCT g_pStructs[100].
      

  4.   

    c中声明struct类型时,必须要加上struct yourstruct m_yourstruct
    或者定义结构时用typedef  MY_STRUCT*  LPMYSTRUCT;
    c++中就不需要这样直接用struct yourstruct;
    yourstruct m_yourstruct;
    原因....且听下回分解
      

  5.   

    还有,情况是这样的:如果我malloc,又直接free,试过多次都不出错。
    但是我在malloc后,对结构对象的成员做了些操作,再free就不行了。
    我想不明白的是,这些成员只是一些int、long或枚举类型的,没有道理影响到free操作啊。
      

  6.   

    你好好的检查你的程序,这是点基本的C,估计你细心一点就没事的。
    我现在也说不上你的问题出在哪儿。
    签名:jmcooler
      

  7.   

    to: sammon(努力学习) 
    在我的程序中还用到许多的结构(包括全局结构指针数组),都是这样定义的,但它们的使用(malloc和free)都没出错。同样的方式使用,却不同的结果,使我更加不明白。
      

  8.   

    我找到了出错地方:我的结构中定义了一个枚举类型的成员变量。
    在操作中如果我对该成员变量进行赋值,则free()出错!
    如果我将对该成员的赋值这一行去掉,则free不出错!
    这个试过了多次。是不是枚举类型的冬冬有bug?
      

  9.   

    是不是赋错值了?不是枚举内的范围???
    还有,我建议你使用C++的new和delete
      

  10.   

    to:cywater2000(如果) 
    不会,我是用枚举值进行赋值的。
    更奇怪的是,我定义的两个枚举类型变量,对第二个进行赋值则不出错。
    typedef struct{
    long   l;
    MY_ENUM e1;
    MY_ENUM e2;
    }MY_STRUCT;
    对e1赋值则free出错,对e2赋值则不出错。
    另外,因为是底层开发,规定采用c,因此我不能用new和delete.
      

  11.   

    枚举类型?
    如果赋值不对会引起内存问题,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)造成内存问题。
      

  12.   

    我试过,没有问题
    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;
    }