在C中初始化字符串的正确方法

foo*_*r01 12 c string char

我见过人们的代码是:

char *str = NULL;
Run Code Online (Sandbox Code Playgroud)

而且我也看到了这一点,

char *str;
Run Code Online (Sandbox Code Playgroud)

我想知道,初始化字符串的正确方法是什么?什么时候你应该初始化一个字符串w /和w/out NULL?

pax*_*blo 16

你应该在使用它之前设置它.这是您必须遵循的唯一规则,以避免未定义的行为.无论是在创建时初始化它还是在使用它之前分配它都是不相关的.

就个人而言,我更喜欢永远不会将变量设置为未知值,所以我通常会做第一个,除非它设置得非常接近(在几行内).

实际上,使用C99,你不必再在块的顶部声明本地,我通常会推迟创建它直到它需要,此时它也可以初始化.

请注意,在某些情况下,变量会被赋予默认值(例如,如果它们是静态存储持续时间,例如在文件级别,在任何函数之外声明).

局部变量没有这种保证.因此,如果你的第二个声明(char *str;)在函数内部,它可能有垃圾并尝试使用它将调用前面提到的,可怕的,未定义的行为.

C99标准的相关部分6.7.8/10:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:

  • 如果它有指针类型,则将其初始化为空指针;
  • 如果它有算术类型,则初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员;
  • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.

  • char const s [] ="不错的回答"; (4认同)

Mat*_*lia 5

我想知道,初始化字符串的正确方法是什么?

好吧,由于第二个片段定义了一个未初始化的指向字符串的指针,所以我会说第一个。:)

通常,如果您想放心使用它,最好初始化NULL所有指针。这样,很容易发现未初始化的指针派生的问题,因为取消引用NULL指针会导致崩溃(实际上,就标准而言,这是未定义的行为,但是在我看到的每台机器上都是崩溃)。

但是,您不应该将NULL指向字符串的指针与空字符串混淆:指向字符串的NULL指针意味着该指针不指向任何内容,而空字符串则是“真实的”零长度字符串(即,它仅包含一个NUL字符)。

char * str=NULL; /* NULL pointer to string - there's no string, just a pointer */
const char * str2 = ""; /* Pointer to a constant empty string */

char str3[] = "random text to reach 15 characters ;)"; /* String allocated (presumably on the stack) that contains some text */
*str3 = 0; /* str3 is emptied by putting a NUL in first position */
Run Code Online (Sandbox Code Playgroud)

  • 不。str3是一个数组,而不是指针!文字用于初始化,它被“复制”在缓冲区(`str3`)中,由编译器自动调整大小以容纳该字符串。在此处查找例如:http://msdn.microsoft.com/en-us/library/7w7xccx8%28VS.80%29.aspx。 (4认同)
  • 观察得更好:未修改`str2`(指向字符串文字),并且将'str3`分配在堆栈上(或其他位置,具体取决于该代码放置的位置),该文字仅用于初始化。 (2认同)
  • @EboMike:`str3`具有类型为char []的类型,一旦使用字符串文字将其初始化为char [38]即可完成。此类型是可修改的左值。您不是在修改字符串文字,而是在修改与字符串文字具有相同类型和内容的左值。 (2认同)
  • 啊...我*应该*近看! (2认同)

pm1*_*100 4

这是关于 c 变量的一般问题,而不仅仅是 char ptr。

在声明时初始化变量被认为是最佳实践。IE

char *str = NULL;
Run Code Online (Sandbox Code Playgroud)

是一件好事。这样你就不会出现具有未知值的变量。例如,如果稍后在您的代码中您这样做

if(str != NULL)
 doBar(str);
Run Code Online (Sandbox Code Playgroud)

会发生什么。str 处于未知(并且几乎肯定不是 NULL)状态

请注意,静态变量将被初始化为零/NULL。从问题中不清楚您是在询问当地人还是静态数据