Strlen sizeof 的区别
1. Sizeof是运算符,strlen是函数
2. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
3. strlen只能用char*做参数,且必须是以''\0''结尾的,而sizeof可用类型做参数,还可用函数做参数,如:
int sum();
printf("%d\n", sizeof(sum()));//输出的结果是sizeof(int),即4。
4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5. 大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
charstr[20]="0123456789"; // str是编译期大小已经固定的数组
int a=strlen(str);// a=10; //strlen()在运行起确定,计算的是实际长度
int b=sizeof(str);// 而b=20;//sizeof()在编译期确定,str的类型是int[20],计算的是占据内存的大小
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。
6. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
char c;
sizeof c; //变量名可以不加括弧
7. 当适用于一个结构类型或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
sizeof、strlen计算字符数组、字符指针空间
char* str = "abacd";
sizeof(str)//结果 4 --->str是指向字符串常量的字符指针,sizeof 获得的是一个指针所占的空间,应该是长整型的,所以是4;
sizeof(*str)//结果 1 --->*str是第一个字符,其实就是字符串的第一位'a' 所占的内存空间,是char类型的,占了 1 位;
strlen(str)=5 //--->若要获得这个字符串的长度,则一定要使用 strlen
以下为牛课网的两道面试题
若int 占 2 个字节, char 占 1 个字节, float 占 4 个字节, sizeof(xc) 大小是:
struct stu
{
union{
char bj[5];
int bh[2];
} class;
char xm[8];
float cj;
}xc;
A. 16
B. 18
C. 22
D. 20
答案是 D
内存对齐规定:结构体的总大小为结构体最宽基本类型成员大小的整数倍
可见最宽的是float是4.,数组的形式只是多个数据放在一起而已。
联合体里面总共是5个字节,要为4的倍数所以为8个字节,
所以为8+8+4=20
32位环境下,int *p=new int[10];请问sizeof(p)的值为。
A. 4
B. 10
C. 40
D. 8
答案是 A
p为int型指针