Ошибка сегментации Sprintf - PullRequest
       12

Ошибка сегментации Sprintf

11 голосов
/ 25 августа 2011

numCheck - это число от 1 до 1000.Этот код дает мне ошибку, только когда я собираю результаты sprintf в charcheck.Если я просто использую sprintf без результатов, я не получаю ошибку сегмента.Что здесь происходит?

char * numString;
int charcheck = sprintf(numString, "%d", numCheck);

Ответы [ 5 ]

8 голосов
/ 25 августа 2011

Вам необходимо предоставить собственную память для sprintf.Кроме того, не используйте sprintf, а скорее snprintf:

char buf[1000] = {0};

snprintf(buf, 999, ....);

В качестве альтернативы вы можете выделить память динамически:

char * buf = new char[BUFSIZE];
snprintf(buf, BUFSIZE-1, ...);
/* ... */
delete[] buf;
1 голос
/ 25 августа 2011

Указатель, указанный в качестве первого параметра для sprintf, должен указывать на область памяти, в которую sprintf должна записывать форматированную строку.

В этом случае вы не инициализировали numString дляукажите на память, выделенную для форматированной строки.Так как numString не инициализирован, он может указывать куда угодно, и в вашем случае попытка записать форматированный вывод в это местоположение приведет к ошибке сегментации.

1 голос
/ 25 августа 2011

Первый аргумент sprintf должен указывать на допустимый буфер.У вас есть char*, но он указывает на мусор.

Измените ваш код на:

char numString[80] = { };
int charcheck = sprintf(numString, "%d", numCheck);

, чтобы numString фактически указывал на действительный буфер (из 80 символов в этом примере, все элементы которого инициализированы в 0).

Было бы также хорошо использовать snprintf, чтобы вы могли передать ему размер вашего буфера, что поможет предотвратить переполнение буфера:

const int bufsize = 80;
char numString[bufsize] = { };
int charcheck = snprintf(numString, bufsize - 1, "%d", numCheck);

Обратите внимание, что вы вычитаете единицу из размера буфера, который вы передаете snprintf, потому что вы не хотите, чтобы он использовал самый последний слот, который вы должны убедиться, что NULL обозначает конецстрока.

0 голосов
/ 26 ноября 2013

Самое простое, что нужно сделать, - это использовать массив, как указано выше, например,

char numString[80] = { };

, предложенный Сетом, Иисусом и Керреком.

Я думаю, что последний ответ от sth этохорошее объяснение: «ожидается, что первый параметр sprintf будет указывать на область памяти, в которую sprintf должен записывать форматированную строку».Таким образом, помимо использования массива символов, который будет вызывать выделение памяти для строки, вы также можете использовать это:

char *numstring = (char*) malloc(80);

Это должно позволить вам явно освободить выделенную память, когда она больше не нужна.

0 голосов
/ 25 августа 2011

Вам нужно выделить место для результата, например,

char numString[50];
int charcheck = sprintf(numString, "%d", numCheck);

В вашем случае внутренняя работа sprintf пытается сослаться на NULL, который является значением по умолчанию для указателя в вашем случае.

...