这是......
char* myString = "hello";
...和此有同样的效果吗?
char actualString[] = "hello";
char* myString = actualString;
答案 0 :(得分:33)
没有
char str1[] = "Hello world!"; //char-array on the stack; string can be changed
char* str2 = "Hello world!"; //char-array in the data-segment; it's READ-ONLY
第一个示例在堆栈上创建一个大小为13*sizeof(char)
的数组,并将字符串"Hello world!"
复制到其中。
第二个示例在堆栈上创建char*
并将其指向可执行文件的数据段中的一个位置,该位置包含字符串"Hello world!"
。第二个字符串是 READ-ONLY 。
str1[1] = 'u'; //Valid
str2[1] = 'u'; //Invalid - MAY crash program!
答案 1 :(得分:4)
没有。第一个为您提供指向const
数据的指针,如果您通过该指针更改任何字符,则它是未定义的行为。第二个将字符复制到一个不是const
的数组中,因此您可以随意更改任何字符(直接在数组中或通过指针),不会产生任何不良影响。
答案 2 :(得分:3)
没有。在第一个中,您无法修改myString
指向的字符串,在第二个中可以修改。阅读更多here。
答案 3 :(得分:3)
它不一样,因为第一个示例中myString
指向的未命名数组是只读的并且具有静态存储持续时间,而第二个示例中的命名数组是可写的并具有自动存储持续时间。
另一方面,这是 close 等同于:
static const char actualString[] = "hello";
char* myString = (char *)actualString;
但它仍然不完全相同,因为字符串文字创建的未命名数组不保证是唯一的,而显式数组则是唯一的。所以在下面的例子中:
static const char string_a[] = "hello";
static const char string_b[] = "hello";
const char *ptr_a = string_a;
const char *ptr_b = string_b;
const char *ptr_c = "hello";
const char *ptr_d = "hello";
ptr_a
和ptr_b
保证比较不平等,而ptr_c
和ptr_d
可能相等或不相等 - 两者都有效。