char *s="hello";的问题

树无影 2010-11-09 05:50:44
#include <stdio.h>

int main()
{
char *p="gooddad";
p[0]='k';
printf("%s\n",p);
return 0;
}
这样为什么不可以啊,它不是const型啊??
...全文
305 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-11-10
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
W412975345 2010-11-10
  • 打赏
  • 举报
回复
既然是CONST
P[0]还能赋值吗?
当然会报错
ibetter5 2010-11-10
  • 打赏
  • 举报
回复
char *p="gooddad";"gooddad"当然是常量了,p指向的位置是个常量,你试图用p[0]='k'做修改,就是把常量给改变了,当然报错

*p="hello",对于这个指针来说,他可以指向别的内容,这个不产生影响。
指向常量的指针,指针常量(),这两个概念楼可以看下。
luciferisnotsatan 2010-11-10
  • 打赏
  • 举报
回复
"gooddad"在常量区,你没法修改
FrankHB1989 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wangcheng229 的回复:]

在C++中是支持如此做法的,且也会得到LZ想要的结果。
[/Quote]
简单的错解。
[Quote=引用 17 楼 pink9527 的回复:]

char *p p是一个指针,长度不限定
p[]是一个数据,长度是一个字节
[/Quote]
简单的T某人风格的扯蛋。
[Quote=引用 19 楼 fengxuxing 的回复:]

编译没问题,运行会出错,对于此种行为,结果未定义
[/Quote]
简单的正解。
tracyjk 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 try325 的回复:]
指针指向的"gooddad"在常量区,当然不能修改
[/Quote]
+1
FrankHB1989 2010-11-10
  • 打赏
  • 举报
回复 1
char *p="gooddad";
这样写,C里面是可以的。注意这里字符串字面量不一定是LS某几位一口咬定的const,尽管一些实现会放到常量区之类。
不过ISO C99 Annex. J 1里面明确指出
— The program attempts to modify a string literal (6.4.5).
是undefined behavior。
而C++里面字符串字面量是const的。
ISO C++ 2.13.4也明确指出:
The effect of attempting to modify a string literal is undefined.
此外,ISO C++ Annex. D指出:
D.4 Implicit conversion from const strings [depr.string]
1 The implicit conversion from const to non-const qualification for string literals (4.2) is deprecated.
仅仅是作为静态类型检查的特例;deprecated意味着这种char *p = "..."这类写法不过是为了兼容旧代码,遵循以后标准版本的编译器就算不给你编译过也没什么好奇怪的。现在的编译器一般会给出警告。
所以无论是C/C++,现写代码都应该用const char *p="gooddad";,而且不要去通过*(char*)p='k'之类的去修改p指向的内容。
walkersfaint 2010-11-10
  • 打赏
  • 举报
回复
想要这种结果,就改为数组
Qlaiaqu 2010-11-09
  • 打赏
  • 举报
回复
编译没问题,运行会出错,对于此种行为,结果未定义
cxxer 2010-11-09
  • 打赏
  • 举报
回复
是const的。"gooddad“在常量区存储。写常量区就会出错。
xspace_time 2010-11-09
  • 打赏
  • 举报
回复
char *p p是一个指针,长度不限定
p[]是一个数据,长度是一个字节
wangcheng229 2010-11-09
  • 打赏
  • 举报
回复
在C++中是支持如此做法的,且也会得到LZ想要的结果。
我是小数位 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 haotiantoping 的回复:]
#include <stdio.h>

int main()
{
char *p="gooddad";
p[0]='k';
printf("%s\n",p);
return 0;
}
这样为什么不可以啊,它不是const型啊??
[/Quote]*p="GOODDAD",字符串常量賦給指針,P指向這個常量所在內在區域,其值不能改變!
wwwcalt 2010-11-09
  • 打赏
  • 举报
回复
楼上都说得很对,指针指的是常量,p【0】就是*p,是常量值,常量咋能修改。
Mark0904 2010-11-09
  • 打赏
  • 举报
回复
char *p="gooddad";//p指向常量
p[0]='k'; //p[0]就相当于常量'g'了。这里相当于 'g' = 'k'。


char p[10] = "hello"; 字符数组就可以这样子做。。。
p[0] = 'g';
dream17953 2010-11-09
  • 打赏
  • 举报
回复
C语言不存在字符串变量,字符串要么用数组存,要么放在常量区,但不可更改。
bravery36 2010-11-09
  • 打赏
  • 举报
回复
"gooddad"在常量区,p指向它所以不能改。如果是
char cTmp[10]="gooddad";
char *p=cTmp;
p[0]='k';
这样就不会有问题。
gundamy 2010-11-09
  • 打赏
  • 举报
回复
这个问题问的人好多啊,难倒最近面试的都出这个题?
玖伍叁柒 2010-11-09
  • 打赏
  • 举报
回复
p不是常量,但是p[0]是常量。
liutengfeigo 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 haotiantoping 的回复:]

那*s="hello"又是对的,这题也就是说指针针对的只是一个数组而不是单一的字符是吧?
[/Quote]
不是。
加载更多回复(7)

69,371

社区成员

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

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