Calloc вызывает ошибку сегментации

Вот мой код:

#include <stdio.h>
#include <stdlib.h>

int main(){
int n=10;
char *s= calloc(2,sizeof(char));
sprintf(s,"%d",n);
printf(s);
return 0;
}

Цель состоит в том, чтобы присвоить двухзначное число (char *). когда я запускаю код, я получаю ошибку сегментации. Outout from valgrind - это-

==18540== Command: ./test
==18540== 
==18540== Conditional jump or move depends on uninitialised value(s)
==18540==    at 0x366C06F397: _IO_str_init_static_internal (in /lib64/libc-2.5.so)
==18540==    by 0x366C063C8A: vsprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C04D677: sprintf (in /lib64/libc-2.5.so)
==18540==    by 0x4004FC: main (test.c:8)
==18540== 
==18540== Conditional jump or move depends on uninitialised value(s)
==18540==    at 0x366C06E37B: _IO_default_xsputn (in /lib64/libc-2.5.so)
==18540==    by 0x366C043D38: vfprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C063C98: vsprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C04D677: sprintf (in /lib64/libc-2.5.so)
==18540==    by 0x4004FC: main (test.c:8)
==18540== 
==18540== Conditional jump or move depends on uninitialised value(s)
==18540==    at 0x366C06F20A: _IO_str_overflow (in /lib64/libc-2.5.so)
==18540==    by 0x366C06E3E3: _IO_default_xsputn (in /lib64/libc-2.5.so)
==18540==    by 0x366C043D38: vfprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C063C98: vsprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C04D677: sprintf (in /lib64/libc-2.5.so)
==18540==    by 0x4004FC: main (test.c:8)
==18540== 
==18540== Use of uninitialised value of size 8
==18540==    at 0x366C06F241: _IO_str_overflow (in /lib64/libc-2.5.so)
==18540==    by 0x366C06E3E3: _IO_default_xsputn (in /lib64/libc-2.5.so)
==18540==    by 0x366C043D38: vfprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C063C98: vsprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C04D677: sprintf (in /lib64/libc-2.5.so)
==18540==    by 0x4004FC: main (test.c:8)
==18540== 
==18540== Invalid write of size 1
==18540==    at 0x366C06F241: _IO_str_overflow (in /lib64/libc-2.5.so)
==18540==    by 0x366C06E3E3: _IO_default_xsputn (in /lib64/libc-2.5.so)
==18540==    by 0x366C043D38: vfprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C063C98: vsprintf (in /lib64/libc-2.5.so)
==18540==    by 0x366C04D677: sprintf (in /lib64/libc-2.5.so)
==18540==    by 0x4004FC: main (test.c:8)
==18540==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==18540== 

person user837208    schedule 23.07.2011    source источник


Ответы (4)


Вы выделяете место только для 2 символов, а затем помещаете строку '10 \ 0', которой нужен другой символ для хранения завершающего символа null / 0. Итак, вам нужно выделить 3 символа, чтобы этот конкретный пример работал.

Прочтите строки C для получения полной информации.

person Andrew White    schedule 23.07.2011

Вы выделяете 2 байта, но размер строки равен 3:

'1', '0', '\ 0' (нулевой терминатор) в этом случае результат не определен, так как вы повредили кучу

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

person MByD    schedule 23.07.2011
comment
Другое решение (только для этой ситуации) sprintf(s, "%X", n); ;-P - person MByD; 23.07.2011

Вам необходимо выделить место для нулевого символа строки с завершающим нулем. Всего 3 символа.

Также printf(s); должно быть: printf("%s", s);

person Paul    schedule 23.07.2011

Для этого конкретного фрагмента кода строка «10» требует 3 байта: «1», «0» и «\ 0». Итак, вам нужно выделить 3 байта памяти.

person phoxis    schedule 23.07.2011