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

时间:2015-05-10 21:01:25

标签: c pointers dynamic-memory-allocation array-initialization

请解释

之间的区别
onmessage

char* str = "Hello";

3 个答案:

答案 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"};