C语言sizeof详解

来源:互联网 发布:方正字体侵权 淘宝 编辑:程序博客网 时间:2024/06/05 19:59

一. sizeof 与strlen对比  (来源http://www.vckbase.com/index.php/wv/789)

例子:

view source
print?
01.char* ss = "0123456789";
02.sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
03.sizeof(*ss) 结果 1 ===》*ss是第一个字符
04. 
05.char ss[] = "0123456789";
06.sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
07.sizeof(*ss) 结果 1 ===》*ss是第一个字符
08. 
09.char ss[100] = "0123456789";
10.sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
11.strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
12. 
13.int ss[100] = "0123456789";
14.sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
15.strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的
16. 
17.char q[]="abc";
18.char p[]="a\n";
19.sizeof(q),sizeof(p),strlen(q),strlen(p);
20.结果是 4 3 3 2
二.sizeof(结构体) 内存对齐 参考http://www.189works.com/article-42100-1.html

原则 1:struct各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

原则2:struct的总空间必须是结构体的节边界数(即结构中占用最大空间的类型所占用的字节数)



三.其他

1.sizeof(函数):结果为函数的返回类型的大小

例如

1.short f();
2.printf("%d\n"sizeof(f()));
输出为2


2.sizeof(void)的结果为1


3.数组作为函数参数时当作指针处理

例如:

int f(double d,int i,char j,char k[5])
{

    printf("__________\n");
    printf("d:%d\n",sizeof(d));
    printf("i:%d\n",sizeof(i));
    printf("j:%d\n",sizeof(j));
    printf("k:%d\n",sizeof(k));
    printf("__________\n");
    return ;
}

输出为:

__________
d:8
i:4
j:1
k:4
__________


4.sizeof(union)的结果为联合体中最长类型的长度


5.sizeof 只计算栈中的变量长度,一个类中的静态常量的不计入类的总长度