sizeof的使用注意问题
咱们神马废话不多说,国际惯例,直接看一下C++代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
int main()
{
char* ss1="0123456789";
char ss2[]="0123456789";
char ss3[100]="0123456789";
int ss4[100];
char q1[]="abc";
char q2[]="a\n";
char*q3="a\n";
char *str1=(char *)malloc(100); //这里使用malloc向系统申请100个自己的内存空间
void *str2=(void *)malloc(100);
cout<<sizeof(ss1)<<" ";//ss1是一个字符指针,指针的大小事个定值,占4个字节,所以结果为4
cout<<sizeof(ss2)<<" ";//ss2是个字符数组,用来存放固定长度的字符,占10+1(结束符\0算一个),所以结果是11
cout<<sizeof(ss3)<<" ";//ss3和ss2类似,不过这里声明的数组容量是100,所以结果为100
cout<<sizeof(ss4)<<" ";//ss4是一个整形数组,每个int占4个字节,所以这里是4*100=400,结果为400
cout<<sizeof(q1)<<" ";//q1和ss2类似,结果为4
cout<<sizeof(q2)<<" ";//q2中\n算一个字符,所以结果为3
cout<<sizeof(q3)<<" ";//q3是个字符指针,占固件大小,结果为4
cout<<sizeof(A)<<" ";// 详情看下方的解释,结果为6
cout<<sizeof(B)<<" ";//详情看下方的解释,结果为8
cout<<sizeof(str1)<<" ";// 指针变量的固定大小都为4
cout<<sizeof(str2)<<" ";//指针变量的固定大小都为4
return 0;
}
关于结构体:A和B是两个结构体,在默认情况下,为了方便对结构体内的元素访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说,结构体的长度一
定是最长元素的整数倍。 如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对其单位,但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。
所以:结构体A中包含三个short型的数据,每个占2个字节,结构体对齐参数按照默认的8字节对齐,则a1,a2,a3都去2个字节对齐,sizeof(A)为6,也就是2的整数倍。
结构体B中包含long和short型数据,分别占4,2个字节,结构体默认对其参数为8,所以必须补空字节,增到8时才符合条件,则sizeof(B)为8.也就是4的整数倍。
运行结果如下图所示:

浙公网安备 33010602011771号