亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 2413 | 回復(fù): 13
打印 上一主題 下一主題

C/C++語言:一個(gè)有趣的地址問題。進(jìn)來看看。 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-09-05 20:23 |只看該作者 |倒序?yàn)g覽

  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. }

復(fù)制代碼


問題是:以上的代碼能編譯通過么?如果可以,那么看看這個(gè)輸出結(jié)果應(yīng)該是什么。為什么?如果不能為什么?

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

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
2 [報(bào)告]
發(fā)表于 2006-09-05 20:38 |只看該作者
這也是 C 語言的代碼?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-09-05 20:52 |只看該作者
請(qǐng)教一下 char **pName = reinterpret_cast<char**> (&MyName);這句什么意思

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-09-05 21:07 |只看該作者
原帖由 cmh_2003 于 2006-9-5 20:52 發(fā)表
請(qǐng)教一下 char **pName = reinterpret_cast<char**> (&MyName);這句什么意思


聲名char**類型變量pName指向變量MyName。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-09-05 22:32 |只看該作者
char **pName = reinterpret_cast<char**> (&MyName);
pName指向MyName;
        *pName = MyName;
這里發(fā)生了一個(gè)嚴(yán)重的問題:pName指向MyName, *pName也指向MyName; Myname內(nèi)存已經(jīng)被改寫為它的地址了。
        strcpy(*pName, "haha");
這里把MyName內(nèi)存改寫為haha\0,有一個(gè)小小的溢出錯(cuò)誤----前面只為MyName分配了Tom\0。不過這個(gè)程序太小,往往運(yùn)行到這里不會(huì)COREDUMP。

        cout << *pName << endl;
嚴(yán)重錯(cuò)誤!*pName指向哪里?*pName的內(nèi)存實(shí)際內(nèi)容是:'h' 'a' 'h' 'a' '0',換成地址是?這個(gè)結(jié)果嚴(yán)重依賴平臺(tái):
小尾與大尾的CPU產(chǎn)生的指針值不同,32位與64位的指針值更是天差地別。
不出意料,肯定會(huì)在這里CORE DUMP。

        cout << MyName << endl;

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2006-09-06 10:30 |只看該作者
原帖由 assiss 于 2006-9-5 22:32 發(fā)表
char **pName = reinterpret_cast<char**> (&MyName);
pName指向MyName;
        *pName = MyName;
這里發(fā)生了一個(gè)嚴(yán)重的問題:pName指向MyName, *pName也指向MyName; Myname內(nèi)存已經(jīng)被改寫為它的地 ...





  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. }
復(fù)制代碼


那上面這個(gè)代碼可以編譯通過么?執(zhí)行結(jié)果是什么?

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

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-09-06 11:16 |只看該作者
不可以,結(jié)果同樣是 segment fault ...

道理是一樣的,*pName 作為地址,指向的是一個(gè)無效地址

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

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-09-06 11:42 |只看該作者
原帖由 isjfk 于 2006-9-6 11:16 發(fā)表
不可以,結(jié)果同樣是 segment fault ...

道理是一樣的,*pName 作為地址,指向的是一個(gè)無效地址


  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. }
復(fù)制代碼


那上面這個(gè)代碼可以編譯通過么?執(zhí)行結(jié)果如何?

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-09-06 12:35 |只看該作者
照舊。除了變量存儲(chǔ)的位置從棧挪到了堆里,其它的有什么區(qū)別嗎?

何況強(qiáng)制將一個(gè)字符指針賦值給指向指針的指針本來就是沒有意義的行為,別在這個(gè)問題上浪費(fèi)時(shí)間了。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2006-09-06 12:44 |只看該作者
原帖由 isjfk 于 2006-9-6 12:35 發(fā)表
照舊。除了變量存儲(chǔ)的位置從棧挪到了堆里,其它的有什么區(qū)別嗎?

何況強(qiáng)制將一個(gè)字符指針賦值給指向指針的指針本來就是沒有意義的行為,別在這個(gè)問題上浪費(fèi)時(shí)間了。


哦。是么?
那對(duì)于這兩個(gè)下面這個(gè),想象一下應(yīng)該是什么輸出.


  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. }

復(fù)制代碼


  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. }

復(fù)制代碼

[ 本帖最后由 ftInternet 于 2006-9-6 12:53 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP