2011-08-24 79 views
1
void main() 
{ 
    char *p = "hello"; 
} 

什麼是P的存儲類型和內存中的點(堆棧/數據段)? 字符串「helllo」存儲在哪裏?指向字符串的指針存儲在哪裏

+1

'void main()'! – Marlon

+0

例如,在gcc + linux環境下,「hello」位於'.rodata'部分。 – Stan

回答

2

該字符串存儲在只讀存儲器中。指針本身存儲在main的堆棧中。

+0

堆棧或堆的主? –

+2

@Srikar都不是。 – cnicutar

+0

沒有隻讀存儲器的體系結構不能爲它們編譯C編譯器? :-) – pmg

0

你的字符串在內存中發出,指針指向存儲字符串的內存地址。如果你調用這個指針,它會返回內存地址,你可以使用它。

+2

不回答OP的問題。 – Marlon

5

p是一個局部變量,通常駐留在堆棧上。

該字符串存儲在編譯器決定存儲它的任何地方。通常,它既不是堆棧也不是堆,而是位於可執行映像的數據段的只讀區域。

2

除非你的編譯器的文檔明確void main()是一個合法的簽名,使用int main(void)代替:

int main(void) 
{ 
    char *p = "hello"; 
    return 0; 
} 

正是爲p內存和"hello"分配將實施而變化的字符串。對於ELF和PE/COFF格式,p的存儲器將在main的堆棧幀的內部,而"hello"的存儲器將爲只讀數據段(PE/COFF的.rdata,ELF的.rodata)。