免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2372 | 回复: 13
打印 上一主题 下一主题

C/C++语言:一个有趣的地址问题。进来看看。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-05 20:23 |只看该作者 |倒序浏览

  1. #include <iostream>

  2. char MyName[]="Tom";

  3. void main()
  4. {
  5.         char **pName = reinterpret_cast<char**> (&MyName);
  6.         *pName = MyName;
  7.         strcpy(*pName, "haha");

  8.         cout << *pName << endl;
  9.         cout << MyName << endl;
  10. }

复制代码


问题是:以上的代码能编译通过么?如果可以,那么看看这个输出结果应该是什么。为什么?如果不能为什么?

[ 本帖最后由 ftInternet 于 2006-9-5 20:43 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2006-09-05 20:38 |只看该作者
这也是 C 语言的代码?

论坛徽章:
0
3 [报告]
发表于 2006-09-05 20:52 |只看该作者
请教一下 char **pName = reinterpret_cast<char**> (&MyName);这句什么意思

论坛徽章:
0
4 [报告]
发表于 2006-09-05 21:07 |只看该作者
原帖由 cmh_2003 于 2006-9-5 20:52 发表
请教一下 char **pName = reinterpret_cast<char**> (&MyName);这句什么意思


声名char**类型变量pName指向变量MyName。

论坛徽章:
0
5 [报告]
发表于 2006-09-05 22:32 |只看该作者
char **pName = reinterpret_cast<char**> (&MyName);
pName指向MyName;
        *pName = MyName;
这里发生了一个严重的问题:pName指向MyName, *pName也指向MyName; Myname内存已经被改写为它的地址了。
        strcpy(*pName, "haha");
这里把MyName内存改写为haha\0,有一个小小的溢出错误----前面只为MyName分配了Tom\0。不过这个程序太小,往往运行到这里不会COREDUMP。

        cout << *pName << endl;
严重错误!*pName指向哪里?*pName的内存实际内容是:'h' 'a' 'h' 'a' '0',换成地址是?这个结果严重依赖平台:
小尾与大尾的CPU产生的指针值不同,32位与64位的指针值更是天差地别。
不出意料,肯定会在这里CORE DUMP。

        cout << MyName << endl;

论坛徽章:
0
6 [报告]
发表于 2006-09-06 10:30 |只看该作者
原帖由 assiss 于 2006-9-5 22:32 发表
char **pName = reinterpret_cast<char**> (&MyName);
pName指向MyName;
        *pName = MyName;
这里发生了一个严重的问题:pName指向MyName, *pName也指向MyName; Myname内存已经被改写为它的地 ...





  1. #include <iostream>

  2. void main()
  3. {
  4.         char MyName[]="Tom";
  5.         char **pName = reinterpret_cast<char**> (&MyName);
  6.         cout << *pName << endl;
  7.         cout << MyName << endl;
  8. }
复制代码


那上面这个代码可以编译通过么?执行结果是什么?

[ 本帖最后由 ftInternet 于 2006-9-6 10:33 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-09-06 11:16 |只看该作者
不可以,结果同样是 segment fault ...

道理是一样的,*pName 作为地址,指向的是一个无效地址

[ 本帖最后由 isjfk 于 2006-9-6 11:17 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-09-06 11:42 |只看该作者
原帖由 isjfk 于 2006-9-6 11:16 发表
不可以,结果同样是 segment fault ...

道理是一样的,*pName 作为地址,指向的是一个无效地址


  1. #include <iostream>

  2. using namespace std;

  3. int main()
  4. {
  5.         char *MyName = new char[8];
  6.         strcpy(MyName, "1234567");
  7.         char **pName = reinterpret_cast<char**> (&MyName);

  8.         cout << *pName << endl;
  9.         cout << MyName << endl;

  10.         delete []MyName;
  11.         return 0;
  12. }
复制代码


那上面这个代码可以编译通过么?执行结果如何?

论坛徽章:
0
9 [报告]
发表于 2006-09-06 12:35 |只看该作者
照旧。除了变量存储的位置从栈挪到了堆里,其它的有什么区别吗?

何况强制将一个字符指针赋值给指向指针的指针本来就是没有意义的行为,别在这个问题上浪费时间了。

论坛徽章:
0
10 [报告]
发表于 2006-09-06 12:44 |只看该作者
原帖由 isjfk 于 2006-9-6 12:35 发表
照旧。除了变量存储的位置从栈挪到了堆里,其它的有什么区别吗?

何况强制将一个字符指针赋值给指向指针的指针本来就是没有意义的行为,别在这个问题上浪费时间了。


哦。是么?
那对于这两个下面这个,想象一下应该是什么输出.


  1. #include <iostream>
  2. using namespace std;
  3. void main()
  4. {
  5.         char MyName[]="Tom";
  6.         char **pName = reinterpret_cast<char**> (&MyName);
  7.         cout << (int)((int)pName - (int) MyName) << endl;
  8. }

复制代码


  1. #include <iostream>
  2. using namespace std;

  3. void main()
  4. {
  5.         char *MyName = new char[8];
  6.         char **pName = reinterpret_cast<char**> (&MyName);
  7.         cout << (int) ((int) pName - (int) MyName) << endl;
  8.         delete []MyName;
  9. }

复制代码

[ 本帖最后由 ftInternet 于 2006-9-6 12:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP