Вопрос

У меня проблема со следующим кодом:

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

и это работает как шарм. Теперь я наконец-то могу жить своей жизнью! Еще раз большое спасибо!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top