两种数组指针初始化方法的区别
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"};
请说明两者的区别
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"};