[英]Pointers in C weird behavior inside a function
誰可以給我解釋一下這個
main()
{
int *x,y;
*x = 1;
y = *x;
printf("%d",y);
}
when I compile it in gcc how come running this in main function is ok, while running it in different function wont work like the function below?
test()
{
int *x,y;
*x = 1;
y = *x;
printf("%d",y);
}
int *x,y;
*x = 1;
未定義的行為。 x
沒有指向任何有意義的東西。
這將是正確的:
int *x, y, z;
x = &z;
*x = 1;
y = *x;
或者
int *x, y;
x = malloc(sizeof(int));
*x = 1;
y = *x;
//print
free(x);
未定義的行為是未定義的。 你無法知道它會如何表現。 它似乎可以工作、崩潰、打印不可預測的結果和其他任何東西。 或者它可以在不同的運行中表現不同。 不要依賴未定義的行為
從技術上講,在標准語言中,由於使用了未初始化的值(指針x的值),您調用了所謂的未定義行為。 幕后發生的事情很可能是這樣的:您的編譯器在堆棧上分配局部變量。 調用函數可能會更改堆棧指針,因此不同函數的局部變量位於堆棧上的不同位置。 這反過來使未初始化的 x 的值成為當前堆棧幀中該位置的任何值。 此值可能不同,具體取決於您調用的函數鏈的深度。 實際值可能取決於很多事情,例如回到程序啟動之前調用的進程的整個歷史。 推測實際值可能是什么以及可能發生什么樣的錯誤行為是沒有意義的。 在 C 社區中,我們將未定義的行為稱為甚至有可能讓惡魔飛出你的鼻子。 它甚至可能啟動 WW3(假設安裝了適當的硬件)。
說真的,一個物有所值的 C 程序員會非常小心,不要調用未定義的行為。
由於 x 是一個指針,它不包含 int 本身,它指向另一個保存該值的 memory 位置。
我認為您假設聲明一個指向值的指針也會為其保留 memory ......不在 C 中。
如果你在你的代碼中犯了上述錯誤,也許我給你更多的圖形表示代碼中實際發生的事情會很好......這是一個常見的新手錯誤。 下面的解釋可能看起來有點冗長和基本,但它可能會幫助你的大腦“看到”實際發生的事情。
讓我們開始吧...如果[xxxx]
是存儲在 RAM 中的幾位中的值,而 [????] 是未知值(在物理內存中),您可以說要正確使用 X應該:
x == [xxxx] -> [xxxx]
x == address of a value (int)
當您在上面寫: *x=1
時,您正在更改 RAM 的未知區域的值,因此您實際上是在做:
x == [????] -> [0001] // address [????] is completely undefined !
事實上,我們甚至不知道 IF 地址 [????] 是否已被您的應用程序分配或訪問(這是未定義的部分),地址可能指向任何東西。 Function 代碼,dll 地址,文件句柄結構......這一切都取決於編譯器/操作系統/應用程序 state,並且永遠不能依賴。
因此,為了能夠使用指向 int 的指針,我們必須首先為其分配memory,並將該 memory 的地址分配給 x,例如:
int y; // allocate on the stack
x = &y; // & operator means, *address* of"
或者
x = malloc(sizeof(int)); // in 'heap' memory (often called dynamic memory allocation)
// here malloc() returns the *address* of a memory space which is at least large enough
// to store an int, and is known to be reserved for your application.
此時,我們知道 x 擁有一個正確的 memory 地址,所以我們只說它當前設置為[3948]
(並且包含一個未知值)。
x == [3948] -> [????]
使用*
運算符,您取消引用指針地址(即查找它),以在該地址存儲一個值。
*x = 1;
方法:
x == [3948] -> [0001]
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.