2011-08-24 50 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)。