猿问

char s []和char * s有什么区别?

在C中,可以在声明中使用字符串文字,如下所示:

char s[] = "hello";

或者像这样:

char *s = "hello";

那么区别是什么呢?我想知道在编译和运行时的存储持续时间实际发生了什么。

char s []和char * s有什么区别?

一只甜甜圈
浏览 2020回答 5
5回答

人到中年有点甜

本声明: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指针变量在内存中的位置取决于声明出现的位置(就像在第一个示例中一样)。

慕桂英3389331

鉴于声明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为指向其他数组。

德玛西亚99

char s[] = "hello";声明s是一个数组,char其长度足以保存初始化器(5 + 1 char)并通过将给定字符串文字的成员复制到数组中来初始化数组。char *s = "hello";声明s是指向一个或多个(在本例中为更多)char的指针,并将其直接指向包含文字的固定(只读)位置"hello"。
随时随地看视频慕课网APP
我要回答