C6001 关于使用未初始化值的地址。为什么?
C6001 on using the address of uninitialized value. Why?
这是我的 C++ 代码:
void somefn(char* string){
char *current, *next;
current = strtok_s(string, "a", &next); // next is unitialized -> C6001 in VS 2020
}
int main(){
char buf[] = "foobar";
return 0;
}
某些具有某些标志的编译器认为这是值得警告的(我相信应该无关紧要)。
唯一的问题是:
- 这会导致未定义的行为吗?我目前认为未初始化变量的地址是编译时常量。
- 这是否可以出于任何原因被视为不良做法?为什么?
编辑:承诺的屏幕截图
reference documentation for strtok_s
表明上述代码是完全有效的 假设 string
不是 NULL 指针 。 “未初始化变量的地址是编译时常量”是否完全无关,与诊断没有任何关系。编译器认为您正在使用未初始化的内存。
然而,根据文档,strtok_s
的第 4 个参数仅在第一个参数为 [=14 时才需要初始化指向指针(通过先前调用 strtok_s
) =].
编译器似乎有点挑剔。看起来编译器无法向自己证明 string
永远不会是 NULL
,所以它抱怨这个。
但是,如果您从不在此处使用 NULL
指针调用 strtok_s
,那么这没有任何问题。
这是我的 C++ 代码:
void somefn(char* string){
char *current, *next;
current = strtok_s(string, "a", &next); // next is unitialized -> C6001 in VS 2020
}
int main(){
char buf[] = "foobar";
return 0;
}
某些具有某些标志的编译器认为这是值得警告的(我相信应该无关紧要)。
唯一的问题是:
- 这会导致未定义的行为吗?我目前认为未初始化变量的地址是编译时常量。
- 这是否可以出于任何原因被视为不良做法?为什么?
编辑:承诺的屏幕截图
reference documentation for strtok_s
表明上述代码是完全有效的 假设 string
不是 NULL 指针 。 “未初始化变量的地址是编译时常量”是否完全无关,与诊断没有任何关系。编译器认为您正在使用未初始化的内存。
然而,根据文档,strtok_s
的第 4 个参数仅在第一个参数为 [=14 时才需要初始化指向指针(通过先前调用 strtok_s
) =].
编译器似乎有点挑剔。看起来编译器无法向自己证明 string
永远不会是 NULL
,所以它抱怨这个。
但是,如果您从不在此处使用 NULL
指针调用 strtok_s
,那么这没有任何问题。