1. 程式人生 > >指標變動引起程式崩潰

指標變動引起程式崩潰

《程式設計師面試寶典》上的第七章面試例題9:

       下列程式會在哪一行崩潰?

              structS {                                           //1

                     inti;                                                 //2

int *p;                                        //3

              };                                                     //4

              main()                                               //5

              {                                                      //6

                     S     s;                                        //7  

                     int*p =&s.i;                               //8

                     p[0]=4;                                      //9

                     p[1]=3;                                      //10

                     s.p=p;                                        //11

                     s.p[1]=1;                                    //12

                     s.p[0]=2;                                    //13

              }                                                      //14

答案是會在第13行崩潰。

程式從第8行開始看起,首先程式把s.i的地址給了p,即此時指標p指向機構s中的第一個元素i。

       第9行中,p[0]==*p==s.i。即在結構中i所在的地址內放入整形常量4。

       第10行中,p[1]==*(p+1)==p,即在結構s中p所在的地址上放入常量3。

       第11行,s.p=p,把p的地址放到s.p上,此時結構s中p所在的地址上放入的是一個指標p。由第9行知道指標p指向s結構中的i,即此時s.p記憶體放的是s.i的地址。

       第12行,s.p[1]==*(s.p+1),此時s.p為s.p內所存的值,即第11行賦值的p,也就是&s.i,則這句話實際上就是給以s.p命名的地址空間賦值為1.

       第13行,sp[0]==*sp,注意第12行中的程式更改了sp的值,也就是說現在的sp[0]和第13行中的sp[1]已經不是一個數列了(數列的頭指標變化了),此時的s.p為1,即該程式相當於給地址0X0001空間賦值為2,對一個未做宣告的地址直接進行訪問當然會引發錯誤。

總結:在這道題上糾結了很長時間,最後想明白了,其實這是一道非常簡單的題,讀程式時要時刻分清指標指向的值和指標的值的關係。

相關推薦

指標變動引起程式崩潰

《程式設計師面試寶典》上的第七章面試例題9:        下列程式會在哪一行崩潰?               structS {                                           //1                      int

C語言除錯記憶體訪問出錯而引起程式崩潰問題

在寫程式碼的時候,經常碰到由於記憶體訪問出錯而導致程式崩潰。當代碼量比較多的時候,根本不知道程式錯在哪裡,只能不斷猜測程式碼出錯的地方,將其註釋掉還會不會出現程式崩潰,這種方法雖然最後也能找到問題所在,但是會耗費大量時間。 linux下除錯通常會生成core d

將NULL指標賦值給std::string變數導致程式崩潰

如題:如上圖,但是我們還會經常寫這樣的程式碼,例如我的flamingo中有程式碼如下(已經修正):位於queryresult.cpp中如果fields[i].name為NULL的話,程式將崩潰。備忘一下

指標引起崩潰分析

指標引起的崩潰問題,常見的原因如下: 指標未判空 勞資還沒幹貨呢,你就讓勞資幹活了。 這種情況實際專案當中是非常多的,即使你用了智慧指標,也還是無法避免。當工程很龐大複雜而且一個類都有可能多個人負責的時候,那麼這個指標的訪問堆疊確實千變萬化,你無法確定

格式化輸出引起程式崩潰

伺服器上的程式跑一段時間以後,程序就不存在了。放開core檔案限制:ulimit -c unlimited等待產生core檔案分析core檔案(gdb) bt#0  0x008711d3 in strlen () from /lib/libc.so.6#1  0x00840

Android完美解決獲取Dialog中EditText輸入值空指標程式崩潰問題

//在Activity中寫法的關鍵程式碼: final View dialog_view = getLayoutInflater().inflate(R.layout.item_dialog_boo

“Too many connections”引起MySQL崩潰並啟動失敗

using socket tail lob loaded emd 登錄 報錯 conf 問題描述: 在部署一套新環境的時候,rancher-server上有14個鏡像包一起升級,主要是微服務的寫入和查詢程序,基本上都是需要去連接MySQL的程序。可能是由於大並發連接數據庫,

使用ReadFile程式崩潰的原因

在使用這個函式的時候,很多人都不會特意的去看MSDN文件後面的Remarks解釋,所以可能有時候會出問題,而且不知道出在哪裡。 這個函式的其它引數就不詳細解釋了,就說說lpNumberOfBytesRead這個引數。 MSDN原文:When a read operation reac

python CTP 8193 心跳超時程式崩潰解決方法——8193錯誤

終於,終於,終於!!!! 博主千辛萬苦把CTP 8193心跳超時導致程式崩潰的問題解決了!!!!!經歷了一天一夜的測試後,第二天親眼看到CTP返回了8193錯誤後,我的程式沒有崩潰!第二天早上9:00一到,又自己正常運行了。敲開心~~~ 博主的血淚史,就是搜遍國內外全網,不止博主一個人遇到8

C++程式崩潰解決方案

C++程式崩潰解決方案 如需轉載請標明出處:http://blog.csdn.net/itas109 QQ技術交流群:129518033 目錄 文章目錄 C++程式崩潰解決方案 @[toc] 前言

隱藏未知程式崩潰

原文:https://blog.csdn.net/ren65432/article/details/45395461  windows提供了一個如下函式: LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter

iOS Xcode常見的幾種程式崩潰

導讀:記錄了常見的幾種程式程式碼崩潰的原因及解決方法。 1、報錯資訊 *** Terminating app due to uncaught exception 'NSRangeException', reason: 'NSMutableRLEArray objec

關於QT在開啟子視窗時程式崩潰的其中一個原因分析

其實這個問題當時是糾結了我很長的一段時間,這段時間裡面,我一直在網上面找相關的資料但是卻沒有有用的資訊。 但是在後面的一個機緣巧合之下,我通過函式執行順序來Debug,慢慢的發現問題出現在什麼地方了。現在來總結一下這個問題吧。 其實我現在的經驗覺得,對於QT裡面(由於QT是基於C++的),不

指標解引用會崩潰

- (BOOL)doSomeThing:(NSError **)err {     *err = [NSErrorerrorWithDomain:@"123"code:101userInfo:nil];     returnYES; } 如

Android 應用程式崩潰日誌捕捉

程式崩潰是應用迭代中不可避免的問題,即使有著5年或者10年經驗的程式猿也無法完全保證自己的程式碼沒有任何的bug導致崩潰,現在有一些第三方平臺可以幫助我們蒐集應用程式的崩潰,比如友盟,詳情如下圖 雖然能夠看到崩潰的日誌以及機型等,但還是不是很方便,如果需要精確定位的話需要使用者提供崩潰的時間點、機型

close掉一個失效的MySQL連線導致的程式崩潰

這在沒有連結池控制的應用中十分常見,而我正好在做和MySQL相關的開發工作,在一般的工具類應用中,並沒有使用連結池進行連線的管理,而是直接使用MySQL提供的C API進行操作。而這給我的程式帶來過很多麻煩 比如程式碼如下 int main() { MYSQL *conn

利用MapFile定位程式崩潰(報紅牌)時的程式碼位置

原文:http://www.codeproject.com/KB/debug/mapfile.aspx 1、生成MapFile Project—Setting—C+±—DebugInfo,選擇Line Numbers Only Project—Setting—Link—選擇Generat

windows程式崩潰時自動生成dump檔案方法

  /****************第一步新增createdump.h********************************* 新增一個頭檔案:createdump.h #pragma once #include <windows.h> #inclu

關於初始化順序表,程式崩潰問題

下面程式是錯誤程式 /**********************************************************、 ** 檔案: MergeSeqList.c **問題描述:利用順序儲存實現線性表的功能 ** 2、已有兩個升序排列順序表A

Winows下程式崩潰自動建立Dump檔案以方便跟蹤問題

首先定義一個預設的異常處理回撥函式: LONG CrashHandler(struct_EXCEPTION_POINTERS* pExceptionInfo) { std::string dumpFileName = "./CrashDump.dump"; H