关于编译器默认字节对齐长度的改变的做法~~

#pragma pack(push)//将初始的字节对齐数压栈

#pragma pack(N)//N是你要改变成的字节个数

...

...

你的结构体和类~~

...

#pragma pack(pop)//恢复初始

..

..

关于在C中定义自己的动态数组~~

 

代码
void FlexArray()
{
int **p,i,j,n,m;
printf(
"请输入行数:\n");
scanf(
"%d",&n);
p
=(int **)malloc(sizeof(int )*n);
for(i=0;i<n;i++)
{
printf(
"请输入第%d行的元素个数:\n",i);
scanf(
"%d",&m);
p[i]
=(int *)malloc(sizeof(int)*m);
for(j=0;j<m;j++)
*(p[i]+j)=1;

}

for(i=0;i<n;i++)
{
printf(
"\n");
for(j=0;j<_msize(p[i])/sizeof(int *);j++)
printf(
"%d",*(p[i]+j));

}
for(i=0;i<n;i++)
{
free(p[i]);

}
free(p);


}

 

 

结构体中如果有可变长数组~~~

对其进行操作的正确方式是声明一个结构体指针~~给这个指针动态分配足够的空间~~

再对其进行操作~~

但是直接。。。比如

struct A{

   int p;   

   int x[];

   

}

main()

{

   struct A a;

   a.x[0]=...;

   a.x[1]=...;

  

}

这样访问是非法的~~~不同编译器给可变长数组预留的空间是不同的~~

如果a.p=3;我接下来进行a.x[2]=5的操作~~~这样很可能就把a.p的值修改了~~~

所以遇到可变长数组~~一定要对其进行初始化~~~!!切记~~
正确的方法是

struct A *a=(struct A*)malloc(sizeof(struct A)*N);

a->x[m]=...

..

free(a);


发表于 @ 2009年07月31日 13:38:00