1.首先就是sizeof和strlen的问题:
sizeof的数据类型是:size_t 返回数据的格式是:%lu
strlen的数据类型是:int 返回数据类型格式是:%d
strlen是个函数
sizeof 可以用类型做参数,strlen 只能用 char* 做参数,且必须是以 '\0' 结尾的。此外,sizeof 还可以用函数做参数代码如下:
#include <stdio.h>
#include <string.h>
int main(){
size_t m;
m = sizeof("hello world");
int i;
i = strlen("hello world");
printf("size:%zu\nstrlen:%d\n", m, i);
return 0;
}
输出:size:12
strlen:11
所以sizeof计算的结果包括'\0', 而strlen是不包括的。
2.现在就得讲讲类型所定义的大小是问题了:
struct {
int a;
short b;
double c;
}A;
sizeof(A)等于多少?
int占4字节
short 占2字节
double占8字节
所以总共是14字节,但保存的时候会采取字节对齐的方式,所以sizeof(A)=16;
struct {
char *p;
int a[3];
float b;
}B;
在linux系统中 指针变量是占8个字节(这个跟操作系统是有关系的,在32位操作系统内是4个字节)
变量B.a占 4*3=12个字节
B.b占4个字节
所以总共是24个字节 采用字节对齐方式, sizeof(B)=32;
char var[10];
int func(char var[]){
return sizeof(var)
}
结果为:4 var[] 等价于 *var ,当数组名以形参传递给函数时,已经退化为一个指针。
void *func(void){
return NULL;
}
sizeof(func)=8(这个跟操作系统是有关系的,在32位操作系统内是4个字节)。