请解释
之间的区别onmessage
和
char* str = "Hello";
答案 0 :(得分:4)
ISO 9899-1990 6.5.7 ("初始化")说:
字符类型数组可以由字符串初始化 文字,可选择括在括号中。
答案 1 :(得分: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';
你会崩溃,因为尽管是指向非const char
的指针,a
实际上指向一个常量字符串。修改它不是一个好主意。
那么其他情况呢,
char a[] = "Hello";
a[0] = 'A';
非常好。在这种情况下,您将获得一个包含字符串的{em> new char
数组。当然这是非常规的,所以你可以修改它。
答案 2 :(得分:1)
我认为这是一个先前已回答的问题。链接将是 - Braces around string literal in char array declaration valid? (e.g. char s[] = {"Hello World"})
两个声明都是一样的。它为什么存在的答案是为了满足编码员的口味而提供一些变化。(语法糖) 我唯一想指出的是char数组变量声明与字符指针声明。您定义的指针尚未分配任何内存。因此,对字符串的任何编辑/写入操作都将导致分段错误。 考虑声明
char str[] = "Hello";
或
char str[] = {"Hello"};