两种数组指针初始化方法的区别

Difference between two methods of array pointer initialization

请说明两者的区别

char* str = "Hello";

char* str = {"Hello"};

ISO 9899-1990 6.5.7 ("Initialization") 说:

An array of character type may be initialized by a character string literal, optionally enclosed in braces.

这些情况之间没有区别。

他们都将字符串文字的地址分配给 char 指针,但在第二种情况下使用了不寻常的语法。

同理,int a = 42;int a = {42};是等价的。


在您提到的评论中 char *a = "Hello";char a[] = "Hello";

他们完全不同。第二个创建一个 array。意思和

一样
char a[] = {'H','e','l','l','o','[=10=]'};

[] 中没有数字,因为编译器可以为您猜测数组的大小(在本例中为 6)。

而另一个案例则完全不同

当您在 char 数组的初始化之外使用 "string literal" 时,就像在这种情况下

printf("Hello");

char *a = "Hello";

编译器隐含地创建一个 const char 的数组来保存您的字符串。如您所知,在这些上下文中,数组的名称会衰减为指向它的第一个元素的指针。所以,

char *a = "Hello";

const char internal_array[] = "Hello";

char *a = internal_array; // same as  char *a = &internal_array[0];

等价

如果你尝试做类似

的事情
char *a = "Hello";
a[0] = 'A';

你会崩溃,因为尽管 char 是一个指向非常量的指针,a 实际上指向一个常量字符串。修改它不是一个好主意。


其他情况呢,

char a[] = "Hello";
a[0] = 'A';

完全没问题。在这种情况下,您会得到一个包含字符串的 new 数组 char 。当然是nonconst,所以你可以修改它。

我认为这是一个以前回答过的问题。 link 将是 - Braces around string literal in char array declaration valid? (e.g. char s[] = {"Hello World"})

两个声明是一样的。它存在的原因的答案是提供一些多样性来满足编码人员的口味。(语法糖) 我唯一想指出的是 char 数组变量声明与字符指针声明。您定义的指针尚未分配任何内存。因此,对字符串的任何 edit/write 操作都会导致分段错误。 考虑声明

    char str[] = "Hello";

    char str[] = {"Hello"};