user-0 提问: 请教2个结构体数组的问题，谢谢

回复:
user: user-0
content: 引用 17 楼 github_27756899 的回复:例一：  struct rec{ 	int salary; //int是4字节   char  name[4]; }  printf("字节数为%d",sizeof(struct rec));  8字节 例二:  struct rec{ 	int salary; //int是4字节   char  name[5]; }  printf("字节数为%d",sizeof(struct rec));  12字节 我理解了，应该是对齐原则，谢谢你这么晚回答我的问题

user: user-1
content: 对齐字节数：2^n=1、2、4、8……

user: user-2
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-3
content: 例一：  struct rec{ 	int salary; //int是4字节   char  name[4]; }  printf("字节数为%d",sizeof(struct rec));  8字节 例二:  struct rec{ 	int salary; //int是4字节   char  name[5]; }  printf("字节数为%d",sizeof(struct rec));  12字节

user: user-3
content: name无宽度仅指示字符的地址 我猜8个字节为一个储存位10个超过8字节

user: user-0
content: 引用 14 楼 github_27756899 的回复:大家互助应该的，用你的结构体也行，只是考虑可能数据不好赋值。 谢谢，你的写法，我搞不清楚name的宽度了  另外，问题2：但是，当我这样定义的时候 struct rec {   char  name[10];   float salary; };  printf("%d",sizeof(struct rec)) 居然是16，不是14 为什么是16呢？

user: user-3
content: 大家互助应该的，用你的结构体也行，只是考虑可能数据不好赋值。

user: user-3
content: 问题2可参考:http://blog.sina.com.cn/s/blog_913c070a0100zq3m.html

user: user-0
content: 引用 11 楼 github_27756899 的回复:问题1就是楼主所说代码。 问题2 ... 改进版代码：  #include <stdio.h> #include <stdlib.h>  struct rec {   char  *name[100];   float salary[100]; };  int main(int argc,char* argv[]) {   struct rec *array_emp;   array_emp=(struct rec *)malloc(sizeof(struct rec));    if (NULL==array_emp)   {     printf("Can not malloc!\n");     return 1;   }   //测试数据如下   array_emp->name[0]="张三";	//记录1   array_emp->salary[0]=3000;   array_emp->name[1]="李四";	//记录2   array_emp->salary[1]=5000;   printf("记录1：\n%s收入为%f\n记录2：\n%s收入为%f\n",array_emp->name[0],array_emp->salary[0],array_emp->name[1],array_emp->salary[1]); }   我有点看不懂了，你的 struct rec {    char  *name[100];    float salary[100]; }; 和我的有什么区别吗？我想表示的是一个结构体数组，等价与数据库的表 name字段长度char(10)，总共可以保存100行 struct rec {    char  name[100][10];    float salary[100]; }; 谢谢这么晚了还帮忙解答

user: user-3
content: 问题1就是楼主所说代码。 问题2 ... 改进版代码：  #include <stdio.h> #include <stdlib.h>  struct rec {   char  *name[100];   float salary[100]; };  int main(int argc,char* argv[]) {   struct rec *array_emp;   array_emp=(struct rec *)malloc(sizeof(struct rec));    if (NULL==array_emp)   {     printf("Can not malloc!\n");     return 1;   }   //测试数据如下   array_emp->name[0]="张三";	//记录1   array_emp->salary[0]=3000;   array_emp->name[1]="李四";	//记录2   array_emp->salary[1]=5000;   printf("记录1：\n%s收入为%f\n记录2：\n%s收入为%f\n",array_emp->name[0],array_emp->salary[0],array_emp->name[1],array_emp->salary[1]); }

user: user-0
content: 引用 8 楼 github_27756899 的回复:你用以下代码测试一下是几个字节  printf("字节数为%d",sizeof(struct rec));   一条记录应该是14字节(姓名是10字节+收入是4字节) 100条记入为1400字节  确实是1400 如果是这样定义呢 struct rec {   char  name[10];   float salary; };  问题1：如果想要100个元素，就要这样了？ array_emp=(struct rec *)malloc(100*sizeof(struct rec));   问题2：但是，当我这样定义的时候 struct rec {   char  name[10];   float salary; };  printf("%d",sizeof(struct rec)) 居然是16，不是14

user: user-3
content: 原帖：（即赵大神）  char name[10]; float salary;  现贴：   char  name[100][10];  float salary[100];

user: user-3
content: 你用以下代码测试一下是几个字节  printf("字节数为%d",sizeof(struct rec));   一条记录应该是14字节(姓名是10字节+收入是4字节) 100条记入为1400字节

user: user-0
content: 引用 6 楼 github_27756899 的回复:用sizeof(struct rec)；就行了 可是赵4大大神是这样写的 array_emp=(struct rec *)malloc(100*sizeof(struct rec));  看这个帖子赵大神的写法 http://bbs.csdn.net/topics/391823730

user: user-3
content: 用sizeof(struct rec)；就行了

user: user-0
content: 引用 4 楼 github_27756899 的回复:1.  sizeof(struct rec) 是1400字节。 2.  100*sizeof(struct rec)是140000字节。 谢谢，那我这里到底应该申请140000字节还是1400字节呢？ 怎么会有140000字节呢？

user: user-3
content: 1.  sizeof(struct rec) 是1400字节。 2.  100*sizeof(struct rec)是140000字节。

user: user-0
content: 引用 1 楼 ant2012 的回复:1. 这个涉及结构体对齐原则。具体机制，可以百度一下。name占10*00个字节，由于能被4（float的大小为4）整除，无需填充字节；salary占4*100个字节,；所以结构体总大小为1400字节 谢谢，此时的sizeof(struct rec) 是14还是1400？ 我这样写是想表示申请100条记录的内存空间，对马？，如下是申请了1400字节吗？ array_emp=(struct rec *)malloc(100*sizeof(struct rec));

user: user-4
content: 2. 由于malloc出来的内存是连续的，所以要想清空一个类型的数组，直接在memset第三个参数设置为类型大小*数组元素个数就行，即程序： memset(&array_emp,0,sizeof(rec) * 100);   MSDN  void *memset( void *dest, int c, size_t count );  dest  Pointer to destination  c  Character to set  count  Number of characters

user: user-4
content: 1. 这个涉及结构体对齐原则。具体机制，可以百度一下。name占10*00个字节，由于能被4（float的大小为4）整除，无需填充字节；salary占4*100个字节,；所以结构体总大小为1400字节