void foo (char *input) {
char *myVar;
*myVar = *input;
}
我明白,如果我分配使用malloc(sizeof(char)
myVar
內存它將指向堆,但如果我不分配內存,當我尊重它,如何編譯器處理內存分配?將它分配在堆棧或堆堆?函數內部的指針變量指向堆棧或堆?
void foo (char *input) {
char *myVar;
*myVar = *input;
}
我明白,如果我分配使用malloc(sizeof(char)
myVar
內存它將指向堆,但如果我不分配內存,當我尊重它,如何編譯器處理內存分配?將它分配在堆棧或堆堆?函數內部的指針變量指向堆棧或堆?
變量myVar
位於堆棧上(對於在堆棧中存儲局部變量的編譯器),但它不指向任何位置。這意味着當您解除引用時,您有未定義的行爲。
技術上,myVar
的值將是不確定的(即看起來是隨機的),因此它將指向一個隨機位置。這意味着解除引用有時會導致崩潰,而其他時間可能不會。
我不會稱之爲隨機的。然後有人來了,想用未分配的內存作爲PRNG ......(沒有找到問題,但有一個這樣的......) – glglgl
@glglgl:你的意思就像臭名昭着的[Debian OpenSSL implementation](http: //msmvps.com/blogs/alunj/archive/2008/05/15/1623193.aspx)? –
@glglgl這就是爲什麼我說*看似*隨機。 –
在取消引用指針時不涉及內存分配。所以你的代碼只是展現*未定義的行爲*。 –
但是,在分配給此代碼段中的取消引用的*不確定*指針時,存在一個很好的**未定義行爲**。 – WhozCraig
在你的代碼中* * myVar = * input;'調用未定義的行爲,btw同時'myVar','input'存儲在堆棧上 –