C++ 当我们初始化数据类型char*时,以及何时不初始化?

C++ 当我们初始化数据类型char*时,以及何时不初始化?,c++,variable-initialization,C++,Variable Initialization,首先,看下面的简单代码: char str[80] = "This is - my text - for test"; const char s[2] = "-"; char *token; token = strtok(str, s); while (token != NULL) { printf(" %s\n", token); token = strtok(NULL, s); } 函数strtok()返回数据类型char*,如您所见,我们创建了一个名为token的

首先,看下面的简单代码:

char str[80] = "This is - my text - for test";
const char s[2] = "-";
char *token;
token = strtok(str, s);

while (token != NULL) {
    printf(" %s\n", token);   
    token = strtok(NULL, s);
}
函数
strtok()
返回数据类型
char*
,如您所见,我们创建了一个名为
token
的变量,该变量未初始化

现在,看下一个代码:

char *buff;
int num = 500;
sprintf(buff, "%d", num);
前面代码的结果是一个错误
未初始化的局部变量'buff'


我的问题是,为什么在第一个代码中没有出现任何问题,而在第二个代码中出现了错误?

因为在第一个代码片段中,您通过调用
strtok
并将调用结果分配给变量来初始化变量
令牌

在第二个示例中,未初始化变量
buff


可以在定义时使用实际初始化来初始化局部变量。或者通过将变量赋给其他位置。重要的是,在以任何其他方式使用变量之前,必须先进行初始化或赋值。

char*token=strtok(str,s)@PeteBecker:那是直接赋值。那是初始化。原始代码创建未初始化的
标记
,然后分配给它。对于像
int
和指针这样的简单类型,技术上的差异有时并不重要(只要您在创建未初始化的变量后立即赋值),尽管出错的几率要高得多。但是对于那些构造函数做了大量工作的类型,有很大的区别。这是
sprintf吗(buff…
被视为赋值或用法。@LionKing
sprintf
函数写入第一个参数指向的内存。它不会修改实际指针。它肯定是用法。如果不确定,请始终以某种方式初始化变量。@LionKing
sprintf(buff…
复制
buff
(作为参数),但
buff
未指定值。