C 指標之對未宣告的位址進行訪問

2021-05-24 14:54:55 字數 1250 閱讀 5684

例1、

下列**的執行結果是什麼?

int *ptr;

ptr=(int *)0x8000;

*ptr=3;

例2、下面這個程式在哪一行會崩潰?

struct s

int i;

int *p;

int main()

s s;

int *p=&s.i;

p[0]=4;

p[1]=3;

s.p=p;

s.p[1]=1;

s.p[0]=2;

return 0;

解析:首先&s.i的位址賦給p,即p指向了i的位址,所以p[0]即為i,p[1]即為s中p指向的位址,即p[1]為*(p+1),p又為

i的位址,所以i的位址加乙個int就是p的位址,即&p,再解引用*(&p)即為p此時指向的位址。

所以p的值為0x00000003,

然後s.p=p;

因為p還是存放著i的位址,此時賦值,即s.p=&s.i;即s中的p指向了s中的i的位址。

s.p[1]=1;

等價於*(&s.i+1)即i的位址加上乙個int,即為p的位址&p,然後解引用即為p指向的位址,所以這句意思即為,為s中的p指向的位址賦值為1,所以s中p的值為0x00000001,此時s中的p就不再指向s中的i的位址了。

最後:s.p[0]=2;

即為*(s.p),即為s中的*p賦值,意思就是在記憶體0x00000001的上面賦值為2,這樣對於乙個未作宣告的位址直接進行訪問,所以出錯,即是在s.p[0]=2;這句中崩潰的。

如果將最後兩句調換則最終是正確的,即

s.p[0]=2;

s.p[1]=1;

這樣是意思是一開始s中的p還是指向s中的i的位址的,s.p[0]=2;這句的意思就是為s中的i賦值為2,因為此時p還是指向i的位址的。

s.p[1]=1;

這句即為*(&s.i+1)即為p指向的位址,將p指向的位址賦值為1,即p指向的位址為0x00000001;所以最後就不會出錯。

總結:int *p = (int*)0x0018ff5c;

*p = 3;

std::cout<<*p《在我機器上輸出了3,說明這塊記憶體是可以訪問的,但是這塊記憶體位址是不一定的,有的電腦上就有可能被占用。不過還有一種方式:

int i;

int m=(int)&i;

int *ptr;

ptr=(int *)m;

*ptr=3;

這樣就是為乙個指定的記憶體位址賦值。

指標之對未宣告的位址進行訪問

例1 下列 的執行結果是什麼?int ptr ptr int 0x8000 ptr 3 把這個位址0x8000給指標ptr 但是這個位址不一定是空閒位址,有可能被其他的地方占用。這樣就又可以導致訪問錯誤。總之 不能隨意的給指標指定乙個位址。例2 下面這個程式在哪一行會崩潰?struct s int ...

C語言直接呼叫未宣告的函式

問題描述 c語言直接呼叫未宣告的函式的坑,跟之前的一篇直接malloc返回值的錯誤有點像。現象下面的函式呼叫,返回值的指標訪問不了 main.c testmalloc test functest printf d test test.h typedef struct testmalloc testm...

C 中「在此作用域中尚未宣告」的錯誤解決

初學者在linux中進行c 程式設計時會遇到 cout 在此作用域中尚未宣告 的錯誤。很多人會覺得很奇怪,我是嚴格按照c 語法來寫的,為什麼還會在編譯時提示 cout 在此作用域中尚未宣告 的錯誤呢?下面來詳細分析一下錯誤原因,通過分析來得到問題解決辦法。首先我們以一段 為例。如果我們將這個 儲存為...