#include"stdio.h" #include"malloc.h" #include <stdlib.h> //int 4字节,char 1个字节 struct node{ int member1; char member2[10]; int member3[0];//变长数组 }; void main() { struct node *xiaobo1; //printf("%d",sizeof( struct node)); xiaobo1 = malloc(sizeof(struct node)+3*sizeof(int));//变长分配内存 memset(xiaobo1,0,sizeof(*xiaobo1)); (*xiaobo1).member1 = 1; strcpy((*xiaobo1).member2,"xiaobo1"); (*xiaobo1).member3[0] = 30; (*xiaobo1).member3[1] = 31; (*xiaobo1).member3[2] = 32; printf("xiaobo1的内存大小%d/n",sizeof(xiaobo1)); printf("member1的地址:%p,值:%d/n",&((*xiaobo1).member1),(*xiaobo1).member1); printf("member2的地址:%p,值:%s/n",&((*xiaobo1).member2),(*xiaobo1).member2); printf("member3[0]的地址:%p,值:%d/n",&((*xiaobo1).member3[0]),(*xiaobo1).member3[0]); printf("member3[1]的地址:%p,值:%d/n",&((*xiaobo1).member3[1]),(*xiaobo1).member3[1]); printf("member3[2]的地址:%p,值:%d/n",&((*xiaobo1).member3[2]),(*xiaobo1).member3[2]); free(xiaobo1); /* 输出结果: member1的地址:0x9f83008,值:1 member2的地址:0x9f8300c,值:xiaobo1 member3[0]的地址:0x9f83018,值:30 member3[1]的地址:0x9f8301c,值:31 member3[2]的地址:0x9f83020,值:32 */ }
注意变长数组的位置问题
#include"stdio.h"; struct node{ int member1; char member2[0]; int member3; }; void main() { struct node *xiaobo1; xiaobo1 = malloc(sizeof(struct node)+10*sizeof(char)); memset(xiaobo1,0,sizeof(*xiaobo1)); (*xiaobo1).member1 = 1; strcpy((*xiaobo1).member2,"xiaobo1"); //(*xiaobo1).member3 = 30; printf("member1的地址:%p,值:%d/n",&((*xiaobo1).member1),(*xiaobo1).member1); printf("member2的地址:%p,值:%s/n",&((*xiaobo1).member2),(*xiaobo1).member2); printf("member3[0]的地址:%p,值:%d/n",&((*xiaobo1).member3),(*xiaobo1).member3); free(xiaobo1); /* member1的地址:0x852b008,值:1 member2的地址:0x852b00c,值:xiaobo1 member3[0]的地址:0x852b00c,值:1868654968 注意member3的地址和member2指针的地址是同一个内存块儿,这就告诉我们要把可变长的数组放到结构体的最后处理 */ }