中易网

C语言一个关于sizeof和strlen的问题

答案:4  悬赏:10  
解决时间 2021-11-09 20:48
#include<stdio.h>
int main()
{
char buf[]="123456\n";
int size,len;
size=sizeof(buf);
len=strlen(buf);
printf("size=%d,len=%d\n",size,len);
return 0;
}
求大神帮我看下为什么结果是size=8,len=7
最佳答案
常量字符串后面系统默认会加上一个'\0'作为字符串结束符,所以
char buf[]="123456\n";定义数组的时候,会算上字符串结束符,也就是说buf数组的长度其实是8,sizeof作用于数组时计算的是数组占用的内存字节数,所以,结果是8
而strlen计算数组长度时是不包含字符串结束符的,所以,结果是7
全部回答
strlen测字符长度 不包括结束符'\0' sizeof测所占空间 包含结束符'\0'
学习就要学懂,下面的好好看一下 Sizeof与Strlen的区别与联系 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 获得的是一个指针的之所占的空间,应该是 长整型的,所以是4 sizeof(*ss) 结果 1 ===》*ss是第一个字符其实就是获得了字符串的第一位'0' 所占的内存空间,是char类 型的,占了 1 位 strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
实际上这个涉及到内存了, sizeof指的是占用内存的大小,而strlen指的是字符串里面字符数,"123456\n" 字符串后面是有个隐形的 ‘\0’ 字符的,标识字符串结束,所以在内存中占了8个字符。明白否?如果你定义的时候直接定义char buf[20]="123456\n";那么size=sizeof(buf); size=20了。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
三相交流电的功率因数表超前带后是什么解释意
急!有谁知道厦门到阜阳的火车一天有几班?
解释一下这句话的意思!谢谢!
潮安因何得名?
本人模型新手一枚,对模型一概不知,如果要把
双河村地址有知道的么?有点事想过去
哪些食物有补脑健脑的功效?
法律法规规定的监理单位和监理人员的责任是什
黄色牡丹花语是什么?
班道格宠物美容会所怎么去啊,我要去那办事
张店到潍坊最晚一班公共汽车几点?在哪坐车?
新车地胶的抉择 解惑新车铺地胶好吗
晚上和早上什么时候同房怀孕几率高
日本人想来中国,如果去香港办理旅游签证需要
南开托管班哪家好心睿通怎么样?
推荐资讯
宝宝哭得嗓子哑了怎么办
帮忙推荐一点iphone常用软件
有没有什么歌曲是适合表白听的,多推荐几首
演员徐峥档案
全部弄完10万以内的车子,自动挡的,个人在动
雪佛兰景程报价多少
腰部胀胀的,时好时坏,怎么办
中国邮政储蓄(208省道)地址好找么,我有些事
江西鹰潭上饶对比 -- 鹰潭与上饶, 哪个城市
有谁知道这是绿萝是放水里养好一点,还会放土
尚风女装我想知道这个在什么地方
想在苏州找一位辩护律师自愿者
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?