我见过人们的代码是:
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:
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
我想知道,初始化字符串的正确方法是什么?
好吧,由于第二个片段定义了一个未初始化的指向字符串的指针,所以我会说第一个。:)
通常,如果您想放心使用它,最好初始化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)
这是关于 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。从问题中不清楚您是在询问当地人还是静态数据