关于编译器默认字节对齐长度的改变的做法~~
#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

浙公网安备 33010602011771号