簡體   English   中英

在 c 中訪問未初始化的 memory

[英]Accessing uninitialized memory in c

#include<stdio.h>
int main(){
    int i = 3;
    int *k;
    k = &i;
    k++;
    printf("%d ",*k);
    return 0;
}

Output:垃圾值

#include<stdio.h>
int main(){
   int i = 3;
   int *j;
   int **k;
   j = &i;
   k = &j;
   k++;
   printf("%d ",**k);
   return 0;
}

Output:運行時錯誤

在這兩個程序中,k 都是一個指針變量,它訪問未初始化的 memory。 我的問題是為什么它在第二個程序中作為運行時錯誤返回

在第一個示例中, k++i之后遞增k以指向 memory 。 雖然訪問此 memory 不是由 C 定義的,但在常見的實現中(特別是在編譯器的優化沒有顯着改變代碼的情況下), i存儲在堆棧中。 該堆棧也用於其他用途,因此在i之前和之后還有其他可訪問的 memory ,並且使用*k可能會從此 memory 獲取數據。

在第二個示例中, k++遞增k以指向j之后的 memory 。 然后*j可以從這個 memory 中獲取數據,與第一個示例一樣。 然后**j可以使用該數據作為訪問其他 memory 的指針。 *j的內容一般不是有意義的地址。 很可能,它們形成的地址未映射到進程的虛擬 memory 空間中。 嘗試訪問該地址會導致硬件產生故障。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM