请解释两者的区别
char* str = "Hello";
和
char* str = {"Hello"};
请解释两者的区别
char* str = "Hello";
和
char* str = {"Hello"};
ISO 9899-1990 6.5.7(“初始化”)说:
字符类型的数组可以由字符串字面量初始化,可选地用大括号括起来。
这些情况之间没有区别。
它们都将字符串文字的地址分配给 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
当然它是非常量的,所以你可以修改它。
我相信这是一个以前回答过的问题。链接将是 - 字符数组声明中字符串文字周围的大括号有效吗?(例如 char s[] = {"Hello World"})
两个声明都是一样的。它为什么存在的答案是提供一些种类来满足编码人员的口味。(语法糖)我唯一想指出的是 char 数组变量声明与字符指针声明。您定义的指针尚未分配任何内存。因此,对字符串的任何编辑/写入操作都会导致分段错误。考虑声明
char str[] = "Hello";
或者
char str[] = {"Hello"};