2011-07-23 60 views
0

這裏是我的代碼:釋放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; 
} 

目的是assing 2位數的(字符*)。 當我運行代碼時,我得到了段錯誤。 Outout從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== 

回答

4

你只是2個字符分配空間,然後把字符串'10 \ 0' ,這需要另一個字符持有空/ 0終止符。所以你需要爲這個特定的例子分配3個字符來工作。

詳細閱讀C Strings

2

您分配2個字節,但字符串的大小爲3:

「1」,「0」,「\ 0」(零終止子),因爲你破壞堆

結果在這種情況下,未定義

此外,當您分配內存時,不要忘記在最後自由呼叫。

+0

另一種解決方案(僅針對這種情況)是'sprintf(s,「%X」,n);'; -P – MByD

1

您需要爲空終止字符串的空字符分配空間。總共3個字符。

另外printf(s);應該是:printf("%s", s);

1

對於這個特定的代碼串 「10」 需要3個字節,這是 '1', '0',和 '\ 0'。所以你需要分配3個字節的內存。