指標的記憶體分配問題

發布 科技 2024-08-19
14個回答
  1. 匿名使用者2024-02-01

    系統分配了自己的記憶體位址,但 p 指向未知位置。

    如果您不將其指向正確的位址,那麼在將來使用您的程式時,這是可能的。

    有一天,變成字段指標可能會產生嚴重的錯誤,但在您的程式中,它已經是了。

    指向 p 到 &i,這是不允許的,但編譯仍然是可以接受的,因為它們不是型別化的。

    一致。 因此,當定義指標且不指向位址時,通常指向 null;

    你的程式 p 沒有初始化,所以 *p 它根本不知道指向哪裡,是乙個錯誤的指標。

    如果將其更改為。 int **p;

    int i = 3;

    p = &i;

    printf("%d", *p);

    這相當於使用二級指標作為一級指標!

  2. 匿名使用者2024-01-31

    int **p;宣告乙個變數,指標的指標也是乙個變數,這個p,系統會給你分配乙個儲存區域;

    但是 p 指向的記憶體是未知的,它可能是空的,它可能是無法訪問的;

    例如,p 現在指向0x12345678,而儲存在0x012345678位址中的內容恰好是您無法更改的內容。

    例如,如果儲存之前定義的變數值 3,現在使用 *p = &i,即將記憶體位址 0x012345678 的值 3 更改為 i 的位址。

    因此,在 p 指向的地方分配乙個空格,或者指向您可以控制的一段記憶體,然後操作它!

  3. 匿名使用者2024-01-30

    1.在程式中寫入時仍然是正確的,因為 *p 指向 i 的記憶體位址,所以不會有問題。

    2.如果不給 p 賦值,此時因為 p 在棧中,所以 p 的值是隨機值,即 p 會指向乙個不可知的區域,當 p 引用的位址空間大於 2g 時,程式會丟擲異常,直接推出; 如果 p 所指的位址空間小於 2G,但相應的記憶體區域尚未分配,系統也會將其視為非法訪問。 最後,如果幸運的話,p 和 *p 指向乙個合法的記憶體區域,它們會正常工作。

    3.在VC下,如果是除錯模式,他會將堆疊初始化為0xcc,如上所述,這是乙個非法位址,所以會退出程式。

  4. 匿名使用者2024-01-29

    是乙個危險的程式。

    p 是二級指標,即 p 是指向另乙個指標指標變數的指標變數,p 指向指向變數的指標變數。

    你的寫法,*p=&a,是將 p 指向 i 的指標變數指向 i,問題出現了:p 指向 **? 也就是說,什麼是*p? 我不知道! 因為你沒有給他分配空間!

  5. 匿名使用者2024-01-28

    危險的程式。 p 指向 ** 你不確定,所以 *p = &i;這是為不確定的位址分配乙個值,這當然是危險的。

  6. 匿名使用者2024-01-27

    無論作業系統是否可以防止此類記憶體錯誤,最好初始化指標。

    事實上,不僅僅是指標,任何變數都應該被初始化。

  7. 匿名使用者2024-01-26

    該函式返回指標值的副本,但記憶體位址不會更改。

    動態應用堆記憶體,只有使用者手動釋放記憶體,此記憶體為系統恢復,如果使用者不釋放記憶體就會發生洩漏。

    程式執行過程中記憶體洩漏,使用者的動態應用記憶體沒有釋放。

    程式結束後,系統會自動為應用程式分配資源。

  8. 匿名使用者2024-01-25

    你輸出指標 p 的位址,它也占用 4 個記憶體空間,這是有效的記憶體,但如果你這樣做,p 的值是乙個隨機數,即 p 指向乙個未分配的未知空間。

  9. 匿名使用者2024-01-24

    char c;&c 是 C 的位址,對吧? 相同的 &p 也是指標 p 的位址。 指標也必須存在於某個位置。

  10. 匿名使用者2024-01-23

    p 屬於 char* 型別。 空間已經分配。 只是p的值沒有初始化。

  11. 匿名使用者2024-01-22

    好吧,你發現的就是問題所在,這就引出了乙個問題,即當它被釋放時如何處理那段記憶體。

    首先,呼叫函式,作業系統為函式分配記憶體空間,並在定義中定義 char a="abccc";然後,作業系統在記憶體中為應用程式分配 6 個位元組的空間來儲存此字串,末尾為 0

    離開 GE 函式時,該函式占用的記憶體空間由作業系統(作業系統)釋放。 所謂發布過程,就是電影的連續記憶體空間被os**占用,應用不再使用,但是儲存在記憶體中的內容呢? 它仍然在那裡,它不會被清除,因為如果它要被清除,我們理所當然地認為它將是 0,這會消耗大量的作業系統資源,如果專案非常大,速度會變慢,所以作業系統不負責清除 0。

    所以資料仍然會儲存在那裡,你 ge()[2], ge()[3]。您可以依次檢視儲存的字元。

    但是為什麼不能整數輸出呢? 因為它是釋放的,所以它不歸你的程式所有,而且你的程式沒有實際的能力來操作那段記憶體,所以它無法處理它。

  12. 匿名使用者2024-01-21

    ge() 返回指標 char*

    對於某個型別的指標 ptr,可以使用 ptr[i] 獲取從 ptr 開始的 i 型別大小偏移量的第乙個位址。

    簡單來說,指標可以像陣列一樣使用,但是程式設計師必須保證i不能越界,這也是C C++的強項,也是非常棘手的地方,容易出錯,不推薦。

  13. 匿名使用者2024-01-20

    1.每次動態分配記憶體後必須釋放記憶體,否則將來某個時候會出現記憶體洩漏問題。

    2.將字串直接分配給指標實際上是將第乙個位址分配給指標。 指標中儲存的不是字串的內容,而是字串的位址。 當然,字串儲存在與標頭位址相連的記憶體中。

  14. 匿名使用者2024-01-19

    這不是輸出字串的格式控制器,字串應為 %s。

相關回答
6個回答2024-08-19

str 只是指向字串初始字元的位址,當您輸入超過 2 個字元時,系統會將已經占用的空間分配給它,如果占用的儲存空間不儲存重要資訊,也不會出現問題。 >>>More

5個回答2024-08-19

派生類可以轉換為基類,因為派生類本身有基類的成員,所以不需要強制轉換,這就是為什麼派生類的指標和引用可以轉換為基類的指標和引用,而基類的指標和引用只能訪問基類的成員, 即型別轉換的向上強制。 >>>More

9個回答2024-08-19

右鍵單擊桌面上的空白區域,然後選擇個性化。 >>>More

12個回答2024-08-19

假設您外出購買雜貨,時針已經越過了 x 角。 >>>More

20個回答2024-08-19

首先我想解釋一下:陣列名稱是乙個指標,它指向儲存陣列元素的一段記憶體,那麼陣列元素是如何引用的,我給大家舉個例子。 例如,a[3],編譯系統將首先找到陣列的第乙個位址,即a,然後根據中的值確定位址偏移量,即3,從而確定要引用的元素是位址a+3所指向的單元的內容。 >>>More