sizeof()返回的长度包括'\0'吗?strlen()返回长度包括'\0'吗?char a[5]中能放5个字符吗?如果能放,'\0'哪里去了?

sealdh 2003-11-28 11:03:56
问题一:
sizeof()返回的长度包括'\0'吗?strlen()返回长度包括'\0'吗?
问题二:
char a[5]中能放5个字符吗?如果能放,'\0'哪里去了?如:
char a[5]={'a','b','c','d','e'}/////////这一句成立吗?如果成立那a中的结束符在哪里?
问题三:
char *b="abcde";那b可以直接拷贝到一个char a[5]这样的数组中吗?(我的意思是说,'\0'占不占一位呀?
...全文
5848 18 打赏 收藏 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Earthdog 2003-11-30
  • 打赏
  • 举报
回复 1
1.
上面的都说了,我就不说了
2.
是成立的,但是你不能直接将其作为字符串来输出,因为C的字符串是以'\0'作为结尾的,输出的时候,会一直输出到遇到'\0'为止,如果你的运气好,那就是输出一串字符就停止了,运气不好的话,就可能碰到访问非法的提示
3.
如果是使用strcpy的话,可能会出问题,但是如果你使用memcpy则看你的参数如果设置了
char a[5];
char* b = "abcde";
memcpy(a, b, 5);
这样是可以的,但是一旦你的最后一个参数过大,就会出问题了
holy198048 2003-11-30
  • 打赏
  • 举报
回复 1
最好的学习方法是自己编程序
hwonzor 2003-11-28
  • 打赏
  • 举报
回复
用运算符sizeof 可以计算出数组的容量(字节数)。示例7-3-3(a)中,sizeof(a)
的值是12(注意别忘了’\ 0 ’)。指针p 指向a,但是sizeof(p)的值却是4 。这是因为
sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p 所指的内
存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。示例
7-3-3(b)中,不论数组a 的容量是多少,sizeof(a)始终等于sizeof(char *)。

char a[ ] ="hello world";
char *p =a;
cout<<sizeof(a)<<endl;//12 字节
cout<<sizeof(p)<<endl;//4 字节
示例7-3-3 (a )计算数组和指针的内存容量
void Func(char a[ 100] )
{
cout<<sizeof(a)<<endl;//4 字节而不是100 字节
}
示例7-3-3 (b )数组退化为指针
sealdh 2003-11-28
  • 打赏
  • 举报
回复
为什么呢?
hwonzor 2003-11-28
  • 打赏
  • 举报
回复
如果 char *a="abcde",那么strlen(a)返回多少呢?
返回5,不包括结束符
那sizeof(a)返回多少呢?
返回4,因为a是指针。

如果 char a []= "abcde";
strlen(a)返回5,sizeof(a)返回6.
sealdh 2003-11-28
  • 打赏
  • 举报
回复
上面phoenixli(feitian) 所言:
char buffer[] = "this";
sizeof(buffer) = 5;
strlen(buffer) = 4;

为什么sizeof(buffer)=5呢??还有,sizeof()返回的是数据类型的长度吧,而不是字符串的长度?它不能用来返回字符串的长度吗?
beyondtkl 2003-11-28
  • 打赏
  • 举报
回复
如果 char *a="abcde",那么strlen(a)返回多少呢?是5还是6?那sizeof(a)返回多少呢?是5还是6?

strlen(a) // 5
sizeof(a) // 4 a是一个指针啊 指针都是4byte大
sealdh 2003-11-28
  • 打赏
  • 举报
回复
当然可以自己试,在这儿,我只是想讨论一下这样的问题,顺便作一下总结。
bluebohe 2003-11-28
  • 打赏
  • 举报
回复
5
我认为应该是4,a只是指针,指针占用内存大小是四个字节在32位操作系统
beyondtkl 2003-11-28
  • 打赏
  • 举报
回复
char a[5];
char b[] = "abcde";
lstrcpy(a,b); // ok 不用指定终结符

char aa[6];
memcpy(aa,b,5);
aa[5] = 0; // 必须手工指定终结符

int aLen = sizeof(a); // 5
int bLen = sizeof(b); // 6
int aaLen = sizeof(aa);// 6
int aL = lstrlen(a); // 5
int bL = lstrlen(b); // 5
int aaL = lstrlen(aa); // 5


要注意memcpy与lstrcpy的区别
phoenixli 2003-11-28
  • 打赏
  • 举报
回复
char buffer[] = "this";
sizeof(buffer) = 5;
strlen(buffer) = 4;
zerphy 2003-11-28
  • 打赏
  • 举报
回复
楼主完全可以自己试试,这样来得快得多
sealdh 2003-11-28
  • 打赏
  • 举报
回复
如果 char *a="abcde",那么strlen(a)返回多少呢?是5还是6?那sizeof(a)返回多少呢?是5还是6?
topwork 2003-11-28
  • 打赏
  • 举报
回复
关于你的问题3,看看这个:
http://expert.csdn.net/Expert/topic/2504/2504204.xml?temp=.1397516
bluebohe 2003-11-28
  • 打赏
  • 举报
回复
sizeof无关\0你申请多长就是多长,strlen不包括\0
不能
成立,但不能把它看成一个正常的字符串,只能当成字符数组
不能,占一位,通过strcpy copy的话
孤必有邻 2003-11-28
  • 打赏
  • 举报
回复
关键是
区分字符数组和字符串两个概念:
1
字符数组不考虑其中有没有'\0'
字符串操作借用字符数组,并规定字符'\0'为串结束标志。
2
定义字符数组并指定大小,如char a[5],此时系统作字符数组处理,size=5;
如果不指定大小,如char a[]="xxx";,或者char*p="xxx";,此时系统作字符串处理,自动在末尾加'\0',size比字符数多1。
需要注意的是:对于char a[5];
其一,strlen(a)返回的值是不确定的,取决于相关内存中的不确定值;
其二,鉴于内存分配的字符对齐方式,所以在做了strcpy(a,"abcdefg");之后,不一定就会出错,因为a后面可能就有几个系统留下的空间。
3
区分内存操作与串操作的不同,串操作要检查'\0'的存在,或自动设置'\0'。
fuxf 2003-11-28
  • 打赏
  • 举报
回复
问题一:
sizeof()返回的长度包括'\0'吗?strlen()返回长度不包括'\0'吗?
问题二:
char a[5]中能放5个字符吗?如果能放,'\0'哪里去了?如:
char a[5]={'a','b','c','d','e'}/////////这一句成立吗?如果成立那a中的结束符在哪里?
能放,此时没放'\0',不能称为字符串,可以称字符数组.好好看看他们的区别.
问题三:
char *b="abcde";那b可以直接拷贝到一个char a[5]这样的数组中吗?(我的意思是说,'\0'占不占一位呀?
这就不行了.
虽然编译器不报错,但是危险操作.
sealdh 2003-11-28
  • 打赏
  • 举报
回复
谢谢大家,还有一点疑问。
上面beyondtkl(大龙驹宣言:抵制日货,从我做起)的发言中:
char a[5];
char b[] = "abcde";
lstrcpy(a,b); // ok 不用指定终结符

//////为什么上面不用指定终结符?按照上面的复制,a中的5个空间分别为a、b、c、d、e,没有结束符啊,这样能行吗?不太符合字符串的定义吧!

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧