C ++变量没有初始化使用?

时间:2011-06-04 15:55:11

标签: c++ initialization

我收到此错误:

  

正在使用变量“thename”而未初始化

这是我的代码:

char *thename;
cm++;
sprintf(thename, "tutmap%d.map", cm);

6 个答案:

答案 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数组。