例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 在此作用域中尚未宣告 的錯誤呢?下面來詳細分析一下錯誤原因,通過分析來得到問題解決辦法。首先我們以一段 為例。如果我們將這個 儲存為...