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

#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

学习就要学懂,下面的好好看一下
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
温馨提示:内容为网友见解,仅供参考
第1个回答  2020-04-24
2个意义不一样的。
strlen
是函数。参数为
chan*,
专门针对字符串的。
sizeof
是运算符,不是函数,可以这样写sizeof
a,
等等。
strlen求字符串的长度,不含字符串结束标志。因此strlen(a)
==
3
sizeof求的是编译器为数组放分配的空间大小,一旦
char
a[5]
定义了,则就会分配5个字节的空间。
第2个回答  2019-10-23
strlen是测试字符串长度的函数,测试的值为字符串中的实际长度(不包括'\0')。
sizeof的作用就是返回一个对象或者类型所占的内存字节数。一个字符占一个字节,A、B各占一个,还有一个'\0',所以是3。
至于这个为什么是五,因为赋给字符数组的初值如果个数小于数组的长度,其余未赋值的元素自动定为空字符即'\0'
第3个回答  2019-02-21
问题1:
不是字符串存储在一个字节里而是char*
ss指向的是字符串的第一个字节,而你sizeof()内的参数正好是指针所指的那块空间的地址所以是一个字节
问题2:
在c语言中,strlen()的形参是指针,而你的实参s3中并没有结束符\0所以指针不会认为结束,所以长度不能确定
第4个回答  2019-06-23
sizeof(数组名),得到的是这个数组所占的字节数。
char
a[
]="AB";
这样的赋值方法,使得数组的大小就是字符串的大小;而”AB“是一个字符串,字符串是以'\0'结尾的,所以这个字符串有3个字符,也就是说,数组a有3个字节的大小,所以是3了。

在C语言求字符长度的问题,strlen与sizeof怎么计算出来的长度不是我们...
sizeof(p)计算的是p变量的大小 由于p是指针,p的大小就是4字节,它不是求内容的长度,而是变量p本身的大小 同理q指针也一样 你可以试一下将指针指向的内容长度再增长,sizeof(p)仍然是4 字符指针:分配长度用strlen计算后+1 如果算数组分配长度(数组声明时的空间大小,不管字符数组是否填满)用size...

sizeof与strlen区别
在编程中,`sizeof` 和 `strlen` 是两个常用的函数,它们分别用于获取变量或类型占用的内存大小以及字符串的长度。`sizeof` 是一个运算符,用于获取类型或变量所占的内存空间大小,而 `strlen` 是一个函数,用于计算以 `'\\0'` 结尾的字符串的长度。`sizeof` 返回的结果是 `size_t` 类型,一...

c语言编程题,关于sizeof。具体是怎么来的?如果是strlen的话结果是什...
sizeof()是单目运算符,功能是返回括号内那货占用的字节数。括号内是char s[],数组,占用字节数取决于初始化时赋值的内容。初始化赋值的内容是"\\123\\\\100a\\t"下面要说的,你最好比对着课本来看。关于字符,有两种表示形式,普通形式(例如'A'),还有转义字符形式。转义字符是由前导和后缀组成。前...

C语言问题???sizeof,strlen,a0\\OaO\\0什么意思???
---sizeof(a)表示字符组a里元素所占用的字节大小a里有9个元素每个元素占1个字节所以 第一个答案是9。---strlen(a)表示字符组a里的长度也就是有多少个元素strlen遇到'\\0'才会退出。。也就是不算上‘\\0'所以结果是8,。。strlen这个函数是为了方便计算字符串的长度。。

strlen和sizeof的区别
strlen和sizeof在C语言中都是常用的函数,区别在于它们的用途、返回值和计算方式。sizeof是一个运算符,而strlen是一个函数。sizeof用于计算数据类型或变量的大小,而strlen用于计算字符串的长度。sizeof可以计算类型或变量的长度,而strlen只能用于字符串。当sizeof用于类型或变量时,它返回的是该类型或...

关于c 中求字符串长度的函数strlen的小问题
在编程中,`strlen`是用于计算字符串长度的函数。该函数接受一个字符指针作为参数,并持续执行直到遇到空格或其他特定字符停止。例如,`strlen`在遇到数组c[2][3]中的元素时会返回3,因为数组中的元素数量为3。`sizeof`函数则是用来计算系统分配给数组的字节数量。这是两个不同的概念:`strlen`关注的...

C语言中,sizeof和strlen都是表示字符串长度的吗?谁能告诉我它们两者的区...
sizeof 计算的是数据在内存中存放的长度,单位是“字节”,可以对任何数据类型做运算,而且它是一个运算符(和+、-、*、\\类似);当对字符串计算时,包含末尾的"\\0";当对字符数组操作时,返回的是数组的总的长度,也就是当把数组作为参数传递给sizeof时是不会退化的。strlen 计算的是字符串的...

关于sizeof和strlen !!!
首先说明一点,char类型占一个字节,所以sizeof(char)是1,这点要理解 str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在C\/C++中一个指针占4个字节 str2是一个...

这道c语言题目为什么用sizeof运行后是4但是strlen则什么都没有_百度知...
= "abcdefgh";char * p = buf;后面的不用变。这样就不会什么都没有了。应该显示0。因为strlen返回'\\0'字符所在的位置。不知道我这样说你能否理解。我理解win32的常量字符串也花费了很长时间。不要用sizeof去获取一个字符串的长度!sizeof仅仅获得目标的静态长度,也就是在栈上占用的字节数。

C语言中sizeof和strlen函数区别在哪?
1、操作 strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\\0'停止。而sizeof()返回的是变量声明后所占的内存数,不是实际长度。2、参数类型 sizeof可以用类型做参数,strlen...

相似回答