在C中,我可以在指针声明中初始化字符串,就像我可以在char数组声明中初始化字符串一样吗?

aoe*_*oeu 10 c arrays pointers c-strings

这两行代码是否实现了相同的结果?如果我在函数中有这些行,那么在两种情况下字符串都存储在堆栈中吗?除了不需要在第一行代码中声明空终止符之外,我是否应该使用一个而不是另一个?

char  s[] = "string";
char* s   = "string\0";
Run Code Online (Sandbox Code Playgroud)

Bar*_*nau 24

不,这两行没有达到相同的效果.

char s[] = "string"导致一个7个字节的可修改数组,最初用内容填充's' 't' 'r' 'i' 'n' 'g' '\0'(所有内容都在字符串文字中从运行时复制).

char *s = "string"导致指向包含字符串文字"字符串"的某些只读内存.

如果你想修改你的字符串的内容,那么第一个是唯一的方法.如果您只需要对字符串的只读访问权限,那么第二个将稍微更快,因为不必复制字符串.


在这两种情况下,都不需要在字符串文字中指定空终止符.当遇到结束时,编译器将为您处理".

  • 此外,第二个只允许可怕的遗留原因.你应该使用`const char*s ="string";` (5认同)
  • 如果我使用狡猾的图书馆,我同意你(有时).如果代码在我的控制之下,那么我修复它以便`const`不会妨碍我.另一种方法是将必须作为非const参数传递的字符串的副本复制到狡猾的API.有时这是可行的,例如,如果传递的字符串是靠近调用定义的文字,或者作为全局,那么只需使用上面两个选项中的第一个.其他时候它是一个PITA,在这种情况下,你可以采取strdup命中,或抛弃`const`(这是"不安全",但那时你已经使用"不安全"的API). (2认同)