нарушение доступа к sprintf - PullRequest
       15

нарушение доступа к sprintf

1 голос
/ 07 декабря 2008

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

for(i = 0;(i - 1)< n;i++)
{
char* b;
sprintf(b, "%d", i);
}

Он прекрасно компилируется, но при запуске запускает печально известную ошибку "0XC0000005 Access Violation". Я попытался установить b в NULL, "", "0", 0 и кучу других вещей, но затем я получаю ошибку "0XC0000005 Access Violation" или "Expression: string! = NULL. Любая помощь будет оценена!

Ответы [ 5 ]

7 голосов
/ 07 декабря 2008

sprintf записывает данные в существующий буфер, который вы передаете в него в качестве первого параметра. В настоящее время вы вообще не указываете значение b, что означает (IIRC в C), что значение может быть любым. Если вы установите значение NULL или 0, sprintf попытается записать в память, начиная с адреса 0.

Вам необходимо создать буфер соответствующего размера, чтобы sprintf мог записывать в него. Например:

for(i = 0;(i - 1)< n;i++)
{
    char b[10];
    sprintf(b, "%d", i);
}

Является ли на самом деле как вы хотите выделить буфер, конечно, зависит от того, что ваш реальный код хочет сделать с результатами.

1 голос
/ 07 декабря 2008

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, ...);
1 голос
/ 07 декабря 2008

Char * - это неинициализированный указатель на массив char или char. Вам нужно определить буфер char [10], иначе целевой адрес sprintf не определен.

1 голос
/ 07 декабря 2008

Умм ... Ваш указатель на b содержит мусор, так как вы его не инициализировали или не выделили место. Springtf требует, чтобы вы выделили буферное пространство назначения ...

Как минимум, вам нужно что-то вроде char b [50] или любого максимального размера, который вы ожидаете, а не просто char *.

0 голосов
/ 07 декабря 2008

Большое спасибо! Так как мне нужен был символ *, я переписал код на:

for(i = 0;(i - 1)< n;i++)
{
char* b;
char a[100];
b = a;
sprintf(b, "%d", i);
}

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

...