回 帖 发 新 帖 刷新版面

主题:请教一个指针的题

一个交换两字符串的程序,如下:
#include<iostream>
#include<string.h>
using namespace std;
void exchange(char *p1,char *p2)
{
    char a[100];
    strcpy(a,p1);
    strcpy(p1,p2);
    strcpy(p2,a);
}
int main()
{
    char p1[]="beijing",p2[]="shangha";
    exchange(p1,p2);
    puts(p1);
    puts(p2);
    return 0;
}
这个程序运行正确
为什么吧main函数中的第一行改为:
    char *p1="beijing",*p2="shangha";
就错了。。。
求真相!谢谢

回复列表 (共7个回复)

沙发

方法1即正确的方法时:定义字符串时在MAIN函数中定义了一个数组包含了字符串,这个数组定义在栈空间里,栈内存是可写的,所以交换两个字符串是不会出错,而方法2中只是在栈空间中定义了两个指针,在给指针赋值过程中仅仅是让指针指向了数据段中的字符串地址,真正的字符串却在程序的数据段里,而字符串所在数据段很可能是不可写的,所以要交换两个字符串时会出现内存访问错误,楼主可以看看保护模式方面的资料

板凳

char *p1="beijing",*p2="shangha";

这句话初始化后,beijing   shangha两个字符串的内容是不能改变的,放在程序的只读段
因此尝试对其改变就会出现错误

3 楼

“而字符串所在数据段很可能是不可写的”是什么意思啊?
我对这方面不太清楚,能推荐一些书么?谢谢

4 楼

[quote]“而字符串所在数据段很可能是不可写的”是什么意思啊?
我对这方面不太清楚,能推荐一些书么?谢谢[/quote]
强强兄已说:“可以看看保护模式方面的书”,在80X86汇编里就有这东东(386+)
或是你可以理解为:这种定义方式其实就是让指针指向一个const空间,是无法改写的。

5 楼

寻找中国的最优秀的网商领袖精英  
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

6 楼

[quote][quote]“而字符串所在数据段很可能是不可写的”是什么意思啊?
我对这方面不太清楚,能推荐一些书么?谢谢[/quote]
强强兄已说:“可以看看保护模式方面的书”,在80X86汇编里就有这东东(386+)
或是你可以理解为:这种定义方式其实就是让指针指向一个const空间,是无法改写的。[/quote]
哦,懂了,谢了!!

7 楼

使用字符指针的情况下:
char *p1="beijing",*p2="shangha";
可以更改exchange函数
void exchange(void* pp1, void* pp2)//交换两指针中保存的内存值
{
    printf("\tenter exchange(void*,void*)\n");
    printf("\tp1StrAddr=%p,p2StrAddr=%p\n",*(char*)pp1,*(char*)pp2);
    *(char*)pp1=(*(char*)pp1)+(*(char*)pp2);
    printf("\tp1StrAddr=%p\n",*(char*)pp1);
    *(char*)pp2=*(char*)pp1-(char)*(int*)pp2;
    printf("\tp2StrAddr=%p\n",*(char*)pp2);
    *(char*)pp1=*(char*)pp1-*(char*)pp2;
    printf("\tp1StrAddr=%p\n",*(char*)pp1);
    printf("\tleave exchange(void*,void*)\n");
}
然后在主函数中将
exchange(p1,p2);改为exchange(&p1,&p2);
即可实现交换字符串的内容。

我来回复

您尚未登录,请登录后再回复。点此登录或注册