【发布时间】:2013-08-30 17:10:21
【问题描述】:
当我声明以下内容时,幕后会发生什么:-
char a[]="June 14";
和
char *a="June 14";
我的意思是如何为上述两个声明(如 stack 、 data segment 等等)分配内存。
【问题讨论】:
-
这些声明是在文件范围(在任何函数之外)还是在块范围(在函数内部)进行的?
-
前者在你的进程中有两个字符串副本;一个在只读数据段中,另一个 (
a[]) 是在声明a的任何范围内的可写副本。后者有一个字符串的副本,并且它在一个只读段中,由a指向。 -
@WhozCraig:这取决于它们出现的位置。如果它们是在文件范围内声明的,那么前者只需要字符串的一份副本。
-
@EricPostpischil 有趣。除了在任何远程现代 C/C++ 编译中的只读段之外,我从未在任何地方看到常量文字(无论它们是否需要)。我将不得不调试 rt-lib 启动代码以查看该初始化会发生什么。我现在很好奇。
-
@WhozCraig:在文件范围内的
char []="June 14";中,字符串不是常量;它只是数组的初始数据,通常出现在数据段(不是只读数据段)中。在块范围内,编译器通常会将字符串的副本放在只读数据段中,并在每次执行到达声明时使用该副本来初始化堆栈上新创建的数组。
标签: c arrays string pointers memory