char *p="abcd"和char p[]="abcd"的区别

zrhk 2002-12-06 02:28:10
程序一:
char *p="abcd";
sizeof(p)/sizeof(char); //为4
*(p+4)=='\0'; //true!
strupr(p); //这行编译通过但是运行会出错

程序二:
char p[]="abcd";
sizeof(p)/sizeof(char); //为5
*(p+4)=='\0'; //true
strupr(p); //all right

我认为问题主要是在申请的空间上
为什么一个空间4,另个为5,请大家多多指点
...全文
721 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppgg1979 2002-12-06
  • 打赏
  • 举报
回复
我也搞错了,p[]的大小应该是5,最后还有一个'\0'
ppgg1979 2002-12-06
  • 打赏
  • 举报
回复
楼上的是不是搞错了

char *p="abcd" ;
sizeof(p)/sizeof(char); //p 是一个指针 为2(指针占两个字节)
char p[]="abcd"
sizeof(p)/sizeof(char); //p是数组,为4
zrhk 2002-12-06
  • 打赏
  • 举报
回复
呵呵,我只想把程序的要点写出
不想让各位兄弟看得太烦
谢谢大家了!
bluejean 2002-12-06
  • 打赏
  • 举报
回复 1
这大概是系统内部的隐藏机制吧,我想。

对"abcd"这个const char *,系统会在后面加上一个'\0',这样在对这个const char *进行操作的时候会自动在'\0'处终止,就不怕越界了,这个操作可以对用户透明。

原来你这里两个*(p+4)=='\0'是这个意思,那我刚才理解错啦,:P,不过你这样写确实不好理解,而且系统会报warning的吧(因为系统以为你想写=),还不如写成bool test = (*(p+4) == '\0');这样可能更加明确点,:)
zrhk 2002-12-06
  • 打赏
  • 举报
回复
我知道了,原来是const的难怪改不了
这四个空间应该是p+0,p+1;p+2;p+3;
但是只有四个空间为什么,*(p+4)=='\0' 会为真呢?

这个'\0'是放在哪个空间?
bluejean 2002-12-06
  • 打赏
  • 举报
回复
呵呵,错误蛮多的。

两个程序的第三行用了==,这是错的,既然是赋值,就是=,而且我们后面可以看到,这两句话都是错误的或者多余的。

程序一中"abcd"是const char *,既然是const的,就不能进行改变,strupr试图去改变,出错。

程序一中p指向的空间只有4个字符,即使第三行写的是*(p+4)='\0',那也是错的,因为这是在对第5个字符进行赋值,将会引起不可预知的结果。

char *p="abcd",这是使p指向了一个const char *,这个const char *只有四个字符,所以sizeof得出的是4

char p[]="abcd",这是分配了一个字符串数组,字符串数组在分配时会自动在末尾加上'\0',所以使其长度加1,而且程序二的第三行其实是不需要的。
earthharp 2002-12-06
  • 打赏
  • 举报
回复
p, p + 1, p + 2, p + 3, p + 4
自己数
zrhk 2002-12-06
  • 打赏
  • 举报
回复
char *p的实际空间只四个吗?
那为什么*(p+4)会与'\0'相等
按理应该有五个空间才对,
能具体解释一下吗?
earthharp 2002-12-06
  • 打赏
  • 举报
回复
有一个空间是不允许你写的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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