char a[] = "Hello World!";
这种分配修改阵列只是大足以容纳字符串字面量(包括终止NUL字符)。然后它用字符串文字的内容初始化数组。如果它是一个局部变量,那么这意味着它在运行时会执行memcpy
,每次创建局部变量时都会如此。
当您需要修改字符串时使用此选项,但不需要将其设置得更大。
此外,如果您有char *ap = a;
,那么当a
超出范围时ap
将成为悬挂指针。或者,同样的事情,当a
对于那个函数是局部的时候,你不能做return a;
,因为返回值将悬挂指针到现在被销毁的那个函数的局部变量。
请注意,恰好使用这一点很少见。通常情况下,你不需要一个数组与字符串文字的内容。这是更为常见的有类似:
char buf[100]; // contents are undefined
snprintf(buf, sizeof buf, "%s/%s.%d", pathString, nameString, counter);
char *p = "Hello World!";
这定义指针,并初始化它指向字符串文字。需要注意的是字符串字面量(正常)不可写入的,所以你真的应该有这个:
const char *p = "Hello World!";
使用此当你需要指向不可修改的字符串。
与上面a
,如果你有const char *p2 = p;
或做return p;
,这些都很好,因为指针指向字符串中程序的常量数据的文字,有效期为程序的整个执行。
字符串文字本身的文字withing双引号,构成该字符串的实际字节,在编译时创建并通常被放置与该应用程序内的其他常量数据。然后在代码中字符串文字具体指这个常量数据blob的地址。
首先,使编译器警告 – 2014-10-09 13:33:45
使用无论你想...只是语法糖en.wikipedia.org/wiki/Syntactic_sugar – zambotn 2014-10-09 13:34:11
你错过了最重要的一点是在内存释放,多久你希望你的对象a住在你的节目中。 – Martin 2014-10-09 13:34:33