5 回答
TA贡献1895条经验 获得超7个赞
本声明:
char s[] = "hello";
创建一个对象 - 一个char
大小为6 的数组,称为s
,使用值初始化'h', 'e', 'l', 'l', 'o', '\0'
。这个数组在内存中分配的位置,以及它的存在时间取决于声明出现的位置。如果声明在一个函数内,它将一直存在到声明它的块的结尾,并且几乎肯定会在栈上分配; 如果它在函数之外,它可能存储在“初始化数据段”中,该“初始化数据段”在程序运行时从可执行文件加载到可写存储器中。
另一方面,这个声明:
char *s ="hello";
创建两个对象:
包含值的只读数组,
char
包含值'h', 'e', 'l', 'l', 'o', '\0'
,没有名称且具有静态存储持续时间(意味着它在程序的整个生命周期中存在); 和一个名为pointer-to-char的变量,调用它
s
,该变量使用该未命名的只读数组中第一个字符的位置进行初始化。
未命名的只读数组通常位于程序的“文本”段中,这意味着它从磁盘加载到只读存储器中,以及代码本身。s
指针变量在内存中的位置取决于声明出现的位置(就像在第一个示例中一样)。
TA贡献2036条经验 获得超8个赞
鉴于声明
char *s0 = "hello world";char s1[] = "hello world";
假设以下假设记忆图:
0x01 0x02 0x03 0x04 0x00008000:'h''e''l''l' 0x00008004:'o''''w''o' 0x00008008:'r''l''d'0x00 ...s0:0x00010000:0x00 0x00 0x80 0x00s1:0x00010004:'h''e''l''l' 0x00010008:'o''''w''o' 0x0001000C:'r''l''d'0x00
字符串文字"hello world"
是一个12元素的数组char
(const char
在C ++中),具有静态存储持续时间,这意味着它的内存在程序启动时分配,并保持分配直到程序终止。尝试修改字符串文字的内容会调用未定义的行为。
这条线
char *s0 = "hello world";
定义s0
为char
具有自动存储持续时间的指针(意味着该变量s0
仅存在于声明它的范围内)并将字符串文字的地址(0x00008000
在此示例中)复制到它。请注意,由于s0
指向一个字符串字面量,它不应该被用来作为一个参数,将试图修改它的任何功能(如strtok()
,strcat()
,strcpy()
,等)。
这条线
char s1[] = "hello world";
定义s1
为char
具有自动存储持续时间的12元素数组(长度取自字符串文字),并将文字的内容复制到数组。从内存映射中可以看出,我们有两个字符串副本"hello world"
; 区别在于您可以修改其中包含的字符串s1
。
s0
并且s1
在大多数情况下可以互换; 以下是例外情况:
sizeof s0 == sizeof (char*)sizeof s1 == 12type of &s0 == char **type of &s1 == char (*)[12] // pointer to a 12-element array of char
您可以重新分配变量s0
以指向不同的字符串文字或另一个变量。您无法将变量重新指定s1
为指向其他数组。
TA贡献1770条经验 获得超3个赞
char s[] = "hello";
声明s
是一个数组,char
其长度足以保存初始化器(5 + 1 char
)并通过将给定字符串文字的成员复制到数组中来初始化数组。
char *s = "hello";
声明s
是指向一个或多个(在本例中为更多)char
的指针,并将其直接指向包含文字的固定(只读)位置"hello"
。
- 5 回答
- 0 关注
- 2019 浏览
添加回答
举报