3

请解释两者的区别

char* str = "Hello";

char* str = {"Hello"};
4

3 回答 3

4

ISO 9899-1990 6.5.7(“初始化”)说:

字符类型的数组可以由字符串字面量初始化,可选地用大括号括起来。

于 2015-05-10T21:13:07.477 回答
1

这些情况之间没有区别。

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

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


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

它们完全不同。第二个创建一个数组。意思是一样的

char a[] = {'H','e','l','l','o','\0'};

[]因为编译器可以为您猜测数组的大小(6在这种情况下),所以里面没有数字。

而另一种情况则完全不同。

当您使用数组的"string literal"外部初始化时,例如在这种情况下char

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';

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


其他情况呢,

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

很好。在这种情况下,您会得到一个包含字符串的数组。char当然它是非常量的,所以你可以修改它。

于 2015-05-10T21:29:15.727 回答
1

我相信这是一个以前回答过的问题。链接将是 - 字符数组声明中字符串文字周围的大括号有效吗?(例如 char s[] = {"Hello World"})

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

    char str[] = "Hello";

或者

    char str[] = {"Hello"};
于 2015-05-10T21:43:51.673 回答