主题:请教一个指针的题
qjx909
[专家分:0] 发布于 2010-09-24 13:14:00
一个交换两字符串的程序,如下:
#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个回复)
沙发
强强 [专家分:4740] 发布于 2010-09-24 13:51:00
方法1即正确的方法时:定义字符串时在MAIN函数中定义了一个数组包含了字符串,这个数组定义在栈空间里,栈内存是可写的,所以交换两个字符串是不会出错,而方法2中只是在栈空间中定义了两个指针,在给指针赋值过程中仅仅是让指针指向了数据段中的字符串地址,真正的字符串却在程序的数据段里,而字符串所在数据段很可能是不可写的,所以要交换两个字符串时会出现内存访问错误,楼主可以看看保护模式方面的资料
板凳
sponge [专家分:30] 发布于 2010-09-24 23:05:00
char *p1="beijing",*p2="shangha";
这句话初始化后,beijing shangha两个字符串的内容是不能改变的,放在程序的只读段
因此尝试对其改变就会出现错误
3 楼
qjx909 [专家分:0] 发布于 2010-09-25 23:48:00
“而字符串所在数据段很可能是不可写的”是什么意思啊?
我对这方面不太清楚,能推荐一些书么?谢谢
4 楼
cgl_lgs [专家分:21040] 发布于 2010-09-26 10:15:00
[quote]“而字符串所在数据段很可能是不可写的”是什么意思啊?
我对这方面不太清楚,能推荐一些书么?谢谢[/quote]
强强兄已说:“可以看看保护模式方面的书”,在80X86汇编里就有这东东(386+)
或是你可以理解为:这种定义方式其实就是让指针指向一个const空间,是无法改写的。
5 楼
淘宝商盟 [专家分:30] 发布于 2010-09-26 13:45:00
寻找中国的最优秀的网商领袖精英
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846
占领市场第一先机,合力打造网商系统!
淘宝商盟官网 www.taobaosm.com
http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度
6 楼
qjx909 [专家分:0] 发布于 2010-09-26 17:42:00
[quote][quote]“而字符串所在数据段很可能是不可写的”是什么意思啊?
我对这方面不太清楚,能推荐一些书么?谢谢[/quote]
强强兄已说:“可以看看保护模式方面的书”,在80X86汇编里就有这东东(386+)
或是你可以理解为:这种定义方式其实就是让指针指向一个const空间,是无法改写的。[/quote]
哦,懂了,谢了!!
7 楼
bioexplore [专家分:440] 发布于 2010-10-06 09:14:00
使用字符指针的情况下:
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);
即可实现交换字符串的内容。
我来回复