[英]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.