2014-02-16 92 views
0
void foo (char *input) { 
    char *myVar; 
    *myVar = *input; 
} 

我明白,如果我分配使用malloc(sizeof(char)myVar內存它將指向,但如果我不分配內存,當我尊重它,如何編譯器處理內存分配?將它分配在堆棧堆堆函數內部的指針變量指向堆棧或堆?

+5

在取消引用指針時不涉及內存分配。所以你的代碼只是展現*未定義的行爲*。 –

+2

但是,在分配給此代碼段中的取消引用的*不確定*指針時,存在一個很好的**未定義行爲**。 – WhozCraig

+3

在你的代碼中* * myVar = * input;'調用未定義的行爲,btw同時'myVar','input'存儲在堆棧上 –

回答

2
時,我尊重它

,編譯器如何處理內存分配

反引用指針的值(地址)不分配內存。 解引用只是讓你訪問內存的引用,就是指針指向的地方。

從哪裏分配這個內存(如果有的話)取決於指針的什麼東西。 LS。

注意:解引用未初始化的指針會引發未定義的行爲,就像它對任何讀取未加初始化的內存/變量所做的操作一樣。

+0

是否意味着它在典型的嵌入式系統中指向.BSS(未初始化的數據段)? – Chen

+0

@陳:它可以指向任何地方。在C語言中,除了聲明'static'的變量外,還有** no **默認初始化,默認爲'0'。 – alk

4

變量myVar位於堆棧上(對於在堆棧中存儲局部變量的編譯器),但它不指向任何位置。這意味着當您解除引用時,您有未定義的行爲

技術上,myVar的值將是不確定的(即看起來是隨機的),因此它將指向一個隨機位置。這意味着解除引用有時會導致崩潰,而其他時間可能不會。

+1

我不會稱之爲隨機的。然後有人來了,想用未分配的內存作爲PRNG ......(沒有找到問題,但有一個這樣的......) – glglgl

+1

@glglgl:你的意思就像臭名昭着的[Debian OpenSSL implementation](http: //msmvps.com/blogs/alunj/archive/2008/05/15/1623193.aspx)? –

+0

@glglgl這就是爲什麼我說*看似*隨機。 –