sizeof()与内存对齐问题小探讨

强颜欢笑 提交于 2020-03-18 05:08:25

关于sizeof输出问题

看下面一个例子:

int main() 

{

  char *ss1 = "0123456789";

  char ss2[] = "0123456789";

   char ss3[100] = "0123456789";

   //内存对齐问题

  struct { int a; char b; int c; char d; }st1;

  struct { int a[10]; char b; char c; }st2;

  printf("length1: %d;length2: %d; length3: %d, length4: %d, length5: %d\n",sizeof(ss1),sizeof(ss2), \

  sizeof(ss3), sizeof(st1),sizeof(st2));

  return 0;

}

结果为4,11,100,16,48.

因为ss1首先是一个指针变量,它指向一个字符串,而sizeof输出的是给它传递的变量的长度,因此结果是4;

而对ss2来说,它是一个数组,它的长度未定义,因此要根据字符串的长度来算,再加上一个结束'\0',因此是11;

对于ss3它是一个有固定长度100的字符串,因此输出100;

对于结构体变量st1,与st2来说,默认情况下,为了便于对结构体内元素的访问与管理,当结构体内的元素的长度都小于处理器的位数时,便以最长的元素为对齐单位,也就是说结构体的长度一定是最长的数据元素的整数倍,就是st1里,那么每个元素都占4字节;如果结构体内存在长度大于处理器位数的元素如数组a[12],它的长度为12*4=48,那么此时则用处理器的位数为对齐单位,也就是小于处理器的每个元素的长度为4,大于处理器位数的元素的长度为4的倍数。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!