返回信息流早上遇到的一个问题。字符串反转,函数传进去指针,函数内交换。
最后问题简化成下面的两行代码。
char * str = "hope"; str[2] = 'p'; segmentation fault
改成 char str[] = "hope"; str[2] = 'p'; 可以通过。
求大神解惑。。。。
第一种情况为什么不能写。。。
谢谢…
这是一条镜像帖。来源:北邮人论坛 / cpp / #90760同步于 2016/3/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
char * str = "hope"; str[2] = 'p';
du5307
2016/3/25镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 du5307 的大作中提到: 】
: 早上遇到的一个问题。字符串反转,函数传进去指针,函数内交换。
: 最后问题简化成下面的两行代码。
: char * str = "hope"; str[2] = 'p'; segmentation fault
: ...................
第一种情况,"hope"是一个字符串常量,它的值是一个指针,指向一块只读的存储空间,里面存着'h', 'o', 'p', 'e', '\0'一共5个字符。str是一个指针,初值是上述指针。(安全的写法是const char * str = "hope",毕竟指向的目标不可变)
第二种情况,str是一个可读写的存储空间,里面存5个字符,初值也是'h', 'o', 'p', 'e', '\0',但可以变。
1.还有问题,为什么这么定义了 它就是字符串常量了 然后就不能写了。。。。。这是规定么。。。
2.是不是可以这样理解
char * str = "hope" 从效果上等价于 const char * str
但是这种效果不是因为const 是因为 这个值本身就不可写
【 在 nuanyangyang 的大作中提到: 】
:
: 第一种情况,"hope"是一个字符串常量,它的值是一个指针,指向一块只读的存储空间,里面存着'h', 'o', 'p', 'e', '\0'一共5个字符。str是一个指针,初值是上述指针。(安全的写法是const char * str = "hope",毕竟指向的目标不可变)
: 第二种情况,str是一个可读写的存储空间,里面存5个字符,初值也是'h', 'o', 'p', 'e', '\0',但可以变。
看到了。。。。
在书上看到了。。。。
谢谢~~~~ANSI c 中,初始化指针时创建的字符串常量被定义为只读。
【 在 nuanyangyang 的大作中提到: 】
:
: 第一种情况,"hope"是一个字符串常量,它的值是一个指针,指向一块只读的存储空间,里面存着'h', 'o', 'p', 'e', '\0'一共5个字符。str是一个指针,初值是上述指针。(安全的写法是const char * str = "hope",毕竟指向的目标不可变)
: 第二种情况,str是一个可读写的存储空间,里面存5个字符,初值也是'h', 'o', 'p', 'e', '\0',但可以变。
【 在 du5307 的大作中提到: 】
: 1.还有问题,为什么这么定义了 它就是字符串常量了 然后就不能写了。。。。。这是规定么。。。
首先,char * str定义str是一个指针,指向char。
然后,右边是"hope",它是一个字符串常量。字符串常量都是只读的存储空间。
而第二种情况是一种特殊语法,char str[] = "hope",右边不是字符串常量,这整个定义是字符数组的初始化。
:
: 2.是不是可以这样理解
: ...................
它是只读的,根本原因是“它是字符串常量”。和str如何定义无关。char * str = "hope"严格地说不是完全正确的,因为右边是指向只读空间的指针,左边是指向读写空间的指针,这里有个隐含的(而且不安全的)指针类型转换的过程。
【 在 du5307 的大作中提到: 】
: 看到了。。。。
: 在书上看到了。。。。
: 谢谢~~~~ANSI c 中,初始化指针时创建的字符串常量被定义为只读。
其实你还可以这样:
const char *a;
a = "hello";
puts(a);
a = "world";
puts(a);
a = "haha";
puts(a);
每次给a赋的都是一个指向不可变的空间的指针。
嗯 GET!
字符串常量。。。。。
这个隐式的转换点赞。。。。。
【 在 nuanyangyang 的大作中提到: 】
:
: 首先,char * str定义str是一个指针,指向char。
: 然后,右边是"hope",它是一个字符串常量。字符串常量都是只读的存储空间。
: ...................
嗯 敲过了
顺便把 char const *
char * const 也试了。。。。
最后再谢谢下~!
【 在 nuanyangyang 的大作中提到: 】
:
: 其实你还可以这样:
: [code=c]
: ...................