我收到此错误:
正在使用变量“thename”而未初始化
这是我的代码:
char *thename;
cm++;
sprintf(thename, "tutmap%d.map", cm);
答案 0 :(得分:8)
您正在使用该变量而不初始化它,并且运行此代码将是Undefined Behavior。
也许你的意思是:
char thename[42];
cm++;
sprintf(thename, "tutmap%d.map", cm);
如果你有snprintf,这里有一个函数,证明你保证(“断言”)缓冲区足够大,但是如果你犯了错误,还要检查缓冲区长度并中止:
template<int N>
void fixed_sprintf(char (&array)[N], char const *format, ...) {
va_list args;
va_start(args, format);
int used = vsnprintf(array, N, format, args);
va_end(args);
if (used == N - 1) {
throw whatever_exception_type_you_like("buffer too small");
// or even:
abort();
}
}
“固定”意味着“固定大小”,而不是“与破碎相对”。 :)
答案 1 :(得分:2)
你已经声明了一个指向C字符串但没有为它分配任何内存的指针。
如果你想要堆栈分配的内存使用
char thename[buffer_length];
如果您更喜欢使用堆分配
char *thename = malloc(buffer_length);
我知道问题是标记为C ++但你的代码看起来更像是C。因此使用malloc。
答案 2 :(得分:1)
这很容易理解:
char *thename;
不会初始化thename
,然后:
sprintf(thename, "tutmap%d.map", cm);
使用它。在这种情况下,结果可怕。
答案 3 :(得分:1)
而不是写作:
char *thename;
cm++;
sprintf(thename, "tutmap%d.map", cm);
写:
cm++;
std::stringstream stream;
stream << "tutmap" << cm << ".map";
std::string const name = stream.str();
// and if you really need char* then:
char const* thename = name.c_str();
答案 4 :(得分:0)
char *thename = new char[21]; //21 is used for maximum string length of 20
cm++;
sprintf(thename, "tutmap%d.map", cm);
答案 5 :(得分:0)
thename是一个尚未初始化的指针。将thename更改为符合sprintf生成的完整字符串大小的char数组。