1、
Char
Short
Int
Long
Float
Double 8字节
2、
sizeof(“abc”)=4 //sizeof计算字符串结束符
strlen(“abc”)=3 //strlen只计算字符个数
3、-------------------------
结构体占用的空间有些特别。很多人都会误认为结构体占用的空间就是结构体各个成员占用空间的总和。其实不然:
struct test
{
char m2; // 1
int ml; // 4
float m3; // 4
char a[5]; // 5
}myaa;
这个结构体所占用的空间并不是1+4+4+5 = 14。它占用的空间是20。虽然成员m2只需要1个字节的空间就够用了,但是在32位机下,系统是以每4个字节(32位)为一个单位来分配空间的。第一个 4字节中,有一个字节分配给了m2,剩余3个字节,但是它后面的m1却需要4个字节,因此它后面的3个字节就浪费掉了。同理,数组a[5]虽然只需要5个字节就够了,但是,实际系统却分配了8个字节,后面的3个字节浪费掉了。更有意思的是,我们可以把这个结构体改一下,调换一下各成员的位置:
struct test
{
int ml; // 4
float m3; // 4
char m2; // 1
char a[5]; // 5
}myaa;
这时候sizeof(myaa)得到的值却是16。因为,在给m2分配了1个字节之后,它后面剩余的3个字节并没有浪费掉,而是分配给了后面的数组a[5],m2与后面的数组共同分配了8个字节,尽管它们只需要6个字节,这时候浪费了2个字节
那就是说,若在16位机下,第一种顺序sizeof(test)=14
第二种顺序sizeof(test)=12
struct name1{
char str;
short x;
int num;
}
struct name2{
char str;
int num;
short x;
}
sizeof(struct name1)=8,sizeof(struct name2)=12
在第一个结构中,char需1字节,short需2字节,在32位机中,给char分配1字节后,还余3字节,而short只需2字节,满足其要求,因此将其后余下的3个字节分给short两个,浪费最后的一个字节。
在第二个结构中,为保证num按四个字节对齐,char后的3个字节不能满足int的需求,故其后留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节
4、当操作数是指针时,near指针占2字节,far、huge占4个,unix指针为4个
指针是一个无符号的整型,c++中只跟操作系统有关。在16位机下占2个字节,在32位os中是占4个字节。不管它是int *,还是float * ,char *。
这些类型只是表示它指向的数据类型是整型,浮点型还是字符型的。
下面引自:http://hi.baidu.com/xun1573/blog/item/0b7c1c3eb74c1b3e70cf6cd1
char * ss = "0123456789";
sizeof(ss) 结果 4
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''''结尾的
char q[]="abc";
char p[]="an";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(
void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)