[英]I don't understand the behavior of a pointer
我正在編隊,我們正在看到指針。 我們面臨一個謎團:
#include <stdio.h>
#include <stdlib.h>
int main()
{
short *p_var = 0;
if (p_var == NULL) {
short var = 123;
p_var = &var;
printf("ma variable= %d \n", *p_var);
}
printf("ma variable= %d \n", *p_var);
return 0;
}
如您所見,此 function 的目的是顯示有關 scope 或 null 錯誤等指針的一些問題。 在這里,好的結果是123
和0
,如printf
所示,但其他配合有123
和123
。 我們使用相同的 IDE 並使用相同的編譯器。
你知道會發生什么嗎?
第一個 printf 給出了正確的結果,因為您在 if 塊中聲明了一個變量 var 並使用一個指針變量來打印它的值。
此變量的 scope 僅在 if 塊內。 在 for 循環之外是一個無效指針,因為 c 中的指針用於存儲您尚未在 if 塊外存儲 ant 地址的變量的地址。
此代碼沒有好的行為:第二個printf
的行為是undefined 。
指針在if
塊內設置為指向在此 scope 中定義的變量, var
設置為123
。 第一個printf
的行為是完全定義的,並且確實打印了ma variable= 123
。
當控制離開這個塊時,變量var
離開 scope 並且它的位置可能用於其他目的......或不。
通過指針訪問此 memory 具有未定義的行為。 它可能在某些機器上產生值123
,在其他機器上產生另一個值,例如0
,並在更奇特的架構上崩潰。 行為可以從一個編譯器更改為另一個編譯器,使用不同的編譯器選項,使用不同的操作系統,甚至只是不同的時間......無法預測它,行為是未定義的。
建議您的老師引入無效指針等概念,但他們應該說此代碼的任何行為都是好的或預期的。 請他們解釋這段代碼和你的經驗是一個很好的例子的未定義行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.