提问者:小点点

C6001使用未初始化值的地址。为什么?


这是我的C++代码:

const char SEP[2] = "/";

void somefn(char* string){
    char *current, *next;
    current = strtok_s(string, SEP, &next);  // next is unitialized -> C6001 in VS 2020
    ...
}

它被某个带有某些标志的编译器认为是值得警告的(我相信应该无关紧要)。

唯一的问题是:

  1. 这会导致未定义的行为吗?我目前认为未初始化变量的地址是编译时常量。
  2. 这可以被认为是坏的做法吗?为什么?


共1个答案

匿名用户

strtok_s的参考文档显示,假设string不是空指针,上述代码是完全有效的。“未初始化变量的地址是否是编译时常量”完全无关,与诊断无关。编译器认为您正在使用未初始化的内存。

但是,根据文档,只有当第一个参数为null时,strtok_s的第四个参数才需要初始化指向指针(通过前面对strtok_s的调用)。

编译器似乎相当挑剔。看起来编译器无法向自己证明string在这里永远不会是null,所以它在抱怨这一点。

但是,如果您从未使用null指针调用strtok_s,那么这并没有什么问题。