Переменная C ++ используется без инициализации? - PullRequest
0 голосов
/ 04 июня 2011

Я получаю эту ошибку:

Переменная «thename» используется без инициализации

Вот мой код:

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

Ответы [ 6 ]

8 голосов
/ 04 июня 2011

Вы используете переменную без инициализации, и выполнение этого кода будет неопределенным поведением.

Возможно, вы имели в виду:

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();
  }
}

«Фиксированный» означает «фиксированный размер»,не "противоположность сломанной".:)

2 голосов
/ 04 июня 2011

Вы объявили указатель на строку C, но для нее не выделено никакой памяти.

Если вы хотите, чтобы память выделялась стеком, используйте

char thename[buffer_length];

Если вы предпочитаете выделение кучи, используйте

char *thename = malloc(buffer_length);

Я знаю, что вопрос помечен C ++, но ваш код для меня больше похож на C. Следовательно использование malloc.

1 голос
/ 04 июня 2011

Вместо записи:

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();
1 голос
/ 04 июня 2011

Это довольно легко понять:

char *thename;

не инициализирует thename, а затем:

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

использует это. В этом случае с печальными результатами.

0 голосов
/ 04 июня 2011

thename - указатель, который не был инициализирован. Измените thename на массив char, который будет соответствовать размеру полной строки, сгенерированной sprintf.

0 голосов
/ 04 июня 2011
char *thename = new char[21]; //21 is used for maximum string length of 20
cm++;
sprintf(thename, "tutmap%d.map", cm);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...