因为sizeof数组取的是属于头部指针的字节数,指针都是4个字节长度,strlen是整个字符串的长度
sizeof和strlen是两个不同的C语言函数,主要有以下区别:
1. 作用对象不同:sizeof是用于计算数据类型的大小,而strlen是用于计算字符串的长度。
2. 参数类型不同:sizeof可以计算任意数据类型的大小,包括基本数据类型、结构体、数组、指针等等,而strlen只能计算以空字符'\0'结尾的字符串的长度,即字符数组或指向字符数组的指针。
3. 返回值类型不同:sizeof返回的是一个无符号整数,表示数据类型或变量占用的字节数,而strlen返回的是一个整数,表示字符串的长度,不包含空字符'\0'。
4. 计算方式不同:sizeof在编译时就能够计算出数据类型或变量的大小,而不需要在运行时计算;而strlen需要遍历字符串的每个字符,直到遇到空字符'\0'才能确定字符串的长度。
总之,sizeof和strlen是两个不同的函数,应该根据具体的需求选择使用。如果需要计算字符串的长度,应该使用strlen函数;如果需要计算数据类型或变量的大小,应该使用sizeof函数。
1、打开VS2017创建一个C++控制台应用程序。
2、首先,功能不同。sizeof()是操作符,计算任意类型参数所占内存大小。
3、strlen()是函数,计算以“\0”结束的字符串长度,计算长度不包括“\0”。
4、其次,参数不同。当将字符数组作为sizeof()的参数时,计算字符数组占用内存大小。
5、当将字符数组作为strlen()的参数时,字符数组转化为char*。
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: fun(char [8])fun(char [])都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len){ unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len);}
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
char str[20]="0123456789";int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
长整型的,所以是4sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类
型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
strlen() 计算字符串长度,计算到字符串结束符 '\0' 为止。如果没有遇到 字符串结束符 '\0', 计算结果将不正确。上面语句中,你还没有给 a 初始化,也未赋值,没内容。如果要算 数组占内存大小 要用 sizeof() 运算符,而不是 strlen.
可以,strlen函数是用来计算字符长度,以\0结尾,string类型正好是字符串行的
sizeof可以用来求数组的长度,例如:intarr[]={1,3,5,6,7,8,8,2};printf("%d\n",sizeof(arr)/sizeof(int)); //sizeof(arr)得到这个数组所占的内存空间大小sizeof(int)是每个元素的大小,sizeof(arr)的结果等于32,因为每个int元素占4个字节,这个数组有8个元素。
sizeof(char) = 1 sizeof(short) = 2 sizeof(int) = 2(16位机),4(32位机),8(64位机) sizeof(long) = 4(不知道64位机是多少) 这些其实是每种变量类型所占用的内存的字节数。 malloc()中传入的参数是内存大小,单位为字节。 如果你要定义一个 short 的,元素个数为7的数组,当然就需要 7*2个字节的内存大小。 如果ElemType是结构,也是同理。
通过sizeof可以计算出类型的长度,同样也可以计算出数组的长度,但是这具有一定的局限性。 以下是一段示例代码: session
1: 计算出数组的长度 session
2: 通过函数计算出数组的长度 session
3: 通过函数计算出数组的长度
a=(int**)malloc(sizeof(int*)*r) 首先,这句话的意思就是使用malloc申请sizeof(int*)*r这么大的内存空间。
其次,因为mallo的返回值是void*类型,所以要进行一个类型转换,你可以转换成任何的类型。
最后,因为你要输出一个3*5的矩阵,所以如果直接定义的话,应该定义为inta[3][5],而这个a就是int**类型,所以你使用malloc分配内存值,要将malloc的内存类型格式化为int**类型。 int**p; inta[3][5]; p=a;//可以这样赋值的。 输出一个3*5数列的例子 #include?<stdio.h> #include?<stdlib.h> int?main() { ????int**?a?=?(int**
)malloc(sizeof(int*)*3); int?i=0,?j=0; for?(i=0;?i<3;?i++) { a[i]?=?(int*
)malloc(sizeof(int)*5); for?(j=0;?j<5;?j++) { *(*(a+i)+j)=j; } } for?(i=0;?i<3;?i++) { for?(j=0;?j<5;?j++) { printf("%d\t",?*(*(a+i)+j)); } printf("\n"); } delete[]?a; ????return?0; }