在VC程序中我定义了一个结构如下
typedef struct _paramStru
{
    int paramType;//参数类型 
    union paramData//参数
{    
   int i_data;
   char ch_array[20];
   int i_array[2];
}Value;
}ParamStru;
在使用时,由于不小心进行了如下操作:
  ParamStru *param=new ParamStru;
  param->paramType=MM_KVAR_PARAM;
  param->Value.i_array[0]=11;
  param->Value.i_array[1]=22;
  param->Value.i_array[2]=33;
  param->Value.i_array[3]=44;
  param->Value.i_array[4]=55;
  param->Value.i_array[5]=66;
 ......
  delete param;
但是程序编译没问题,使用也没问题,我很纳闷,但当我把ch_array长度减少到2时,程序就出现异常。请教高手,能给解释一下吗?谢谢!

解决方案 »

  1.   

    这里面的关键在对于union的理解,所谓union就是n个不同类型和名字的变量共享同一块内存区域,而这块内存的大小等于上述n个变量的长度最的的变量的长度。由你的第一个定义可以看出union的最大长度是20个字节,所以虽然你的i_array使用了越界内存,但越界的这部分内存也是分配给你的,所以不会产生问题。当你的ch_array的长度小于4的时候,union的长度就变成了4,所以使用i_array[5]赋值产生的越界就会出现问题(修改了别的变量或者对象的内存的值)。只是有时候这种越界产生的结果不是很明显。
      

  2.   

    你用什么编译器哦?
    我使用VC6.0,编译是没有问题,但程序运行到delete的时候就会发生错误.
      

  3.   

    本来我也同意阿笨猫的说法(书上也是这么说的),但是我在vc6.0下试了一
    不对你不管吧char ch_array[n];n设到几程序都可执行。只不过是在delete 时报错,包括char ch_array[20];
      

  4.   

    搞明白了,阿笨猫的说法是正确的,只不过 WIN32 下int 的长度为4,所以即使ch_array的长度为20时,param->Value.i_array[n],n>4就越界,c++对指针越界使用不做判断,所以可以正常执行param->Value.i_array[5]=66,在删除时,C++对边界进行判断.所以报错.这就是vc++执行时报错的原因