gpt4 book ai didi

c - 初始化指针时,字符串文字与 char 数组

转载 作者:太空狗 更新时间:2023-10-29 16:28:36 24 4
gpt4 key购买 nike

灵感来自 this question .

我们可以通过字符串文字来初始化一个char指针:

char *p = "ab";

而且完全没问题。可以认为它等同于以下内容:

char *p = {'a', 'b', '\0'};

但显然不是这样。不仅因为字符串文字存储在只读内存中,而且看起来即使字符串文字具有 char 数组类型,并且初始化程序 {...} 具有 char 数组类型,两个声明的处理方式不同,因为编译器发出警告:

warning: excess elements in scalar initializer

第二种情况。这种行为的解释是什么?

更新:

此外,在后一种情况下,指针 p 的值为 0x61(第一个数组元素 'a' 的值) 而不是内存位置,这样编译器就会像警告的那样,只获取初始化程序的第一个元素并将其分配给 p

最佳答案

我认为您感到困惑,因为 char *p = "ab";char p[] = "ab"; 具有相似的语义,但含义不同。

我认为后一种情况 (char p[] = "ab";) 最好被视为 char p[ 的速记符号 ] = {'a', 'b', '\0'};(用初始化程序确定的大小初始化数组)。实际上,在这种情况下,您可以说 "ab" 并未真正用作字符串文字

但是,前一种情况 (char *p = "ab";) 的不同之处在于它只是将指针 p 初始化为指向第一个元素只读字符串文字 "ab"

希望您能看出其中的区别。虽然 char p[] = "ab"; 可以表示为您所描述的初始化,但 char *p = "ab"; 不是指针,嗯,而不是数组,并使用数组初始化器初始化它们会做一些完全不同的事情(即给它们第一个元素的值,在你的例子中是 0x61)。

长话短说,C 编译器只会在合适的情况下用 char 数组初始值设定项“替换”字符串文字,即它被用于初始化 char数组。

关于c - 初始化指针时,字符串文字与 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com