首页 新闻 会员 周边

用指针指向的字符串为什么可以比较但不能 作为目的地拷贝?

0
[已解决问题] 解决于 2012-04-13 21:24

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

using namespace std;

int main()
{
 char *strm=(char *)malloc(sizeof(char)*20);//strcpy成功;
 char sstr[20],*sttr=sstr;//strcpy成功
 char *strr="mmmmmmmmmmmmmmmmmmmmmmmmmmm",*strr_1=strr; //strcpy 都失败
 char *str_cpy="hello world";
 //sttr="rrrrrrrrrrrrrrr";
 strcpy(strr_1,str_cpy);
 //strcmp(strr_1,str_cpy);
 printf("%s",strr_1);    
 free(strm);
}

指针直接指向一个初始化了的字符串,就不能作为目的地址了???

爱的谜语的主页 爱的谜语 | 初学一级 | 园豆:187
提问于:2012-04-13 15:48
< >
分享
最佳答案
0

这篇文章你认真读一下:[cpp] 字符数组,字符指针,sizeof,strlen总结

字符串直接量作为字符指针的初始值 

"hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用,

即使程序  中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于 const char *ptr = “hello”;

字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1] = ‘a’;是会引起错误的。

奖励园豆:5
zsounder | 老鸟四级 |园豆:2819 | 2012-04-13 16:04

我看了 非常棒 thanks~

爱的谜语 | 园豆:187 (初学一级) | 2012-04-13 21:23
其他回答(1)
0

字符串变量是一个指针,该指针指向的地址就是字符串内容的存储区域。

你使用简单的字符串变量赋值操作,所执行的是字符串地址的赋值。

代码:

char *strr="mmmmmmmmmmmmmmmmmmmmmmmmmmm",*strr_1=strr;

使得两个字符串变量(指针)strr和strr_1共享数据对象。

要想实现字符串的内容赋值操作,就必须使用内存内容复制功能,这个功能在内置函数strcpy里已经实现,当然,假如你想自己实现也不是不可以的,就像我们对数组复制一样。

 

如果你对数组这个东西了解了的话,那么你把字符串对象当作是一个字符数组来看就没错了。

 

C/C++是很底层的开发语言,千万别拿java、basic、c#等高级语言里的字符串赋值理念来用到这里,那些高级语言里的赋值操作其实是重载了的,相当于在内部调用了strcpy方法。

无之无 | 园豆:5095 (大侠五级) | 2012-04-13 17:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册