нарушение доступа к sprintf
-
20-08-2019 - |
Вопрос
У меня проблема со следующим кодом:
for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}
Он прекрасно компилируется, но когда я его запускаю, он дает мне печально известную " 0XC0000005 Access Violation " ошибка. Я попытался установить b в NULL, & Quot; & Quot ;, & Quot; 0 & Quot ;, 0 и кучу других вещей, но затем я получаю & Quot; 0XC0000005 Access & Нарушение Quot; ошибка или & выражение: строка! = NULL. Любая помощь будет оценена!
Решение
sprintf
записывает данные в существующий буфер, который вы передаете в него в качестве первого параметра. В настоящее время вы вообще не указываете значение b, что означает (IIRC в C), что значение может быть любым. Если вы установите значение NULL или 0, <=> попытается записать в память, начиная с адреса 0.
Вам необходимо создать буфер соответствующего размера, чтобы sprintf мог записывать в него. Например:
for(i = 0;(i - 1)< n;i++)
{
char b[10];
sprintf(b, "%d", i);
}
Является ли на самом деле то, как вы хотите выделить буфер, конечно, зависит от того, что ваш реальный код хочет сделать с результатами.
Другие советы
Умм ... Ваш указатель на b содержит мусор, поскольку вы его не инициализировали или не выделили место. Springtf требует, чтобы вы выделили буферное пространство назначения ...
Как минимум, вам нужно что-то вроде char b [50] или любого другого максимального размера, а не просто char *.
char * - это неинициализированный указатель на массив char или char. Вам необходимо определить буфер char [10], иначе целевой адрес sprintf не определен.
sprintf требует передать ему уже выделенный символьный буфер, достаточно большой для хранения любого возможного результата. Это сильно подвержено переполнению буфера - вы, вероятно, хотите использовать более безопасный snprintf. Один неэффективный, но безопасный способ сделать это:
int bufsize = snprintf(NULL, 0, formatstring, ...);
char *buffer = malloc(bufsize+1); # count doesn't include trailing nul
if (buffer == NULL) out_of_memory_error();
snprintf(buffer, bufsize+1, formatstring, ...);
Большое спасибо! Так как мне нужен символ *, я переписал код на:
for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}
и это работает как шарм. Теперь я наконец-то могу жить своей жизнью! Еще раз большое спасибо!