Calloc导致分段错误

时间:2011-07-23 03:19:11

标签: c segmentation-fault calloc dynamic-allocation

这是我的代码:

#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 *)分配2位数字。 当我运行代码时,我得到分段错误。 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 个答案:

答案 0 :(得分:4)

您只为2个字符分配空间,然后将字符串'10 \ 0'放置,这需要另一个字符来保存null / 0终止字符。所以你需要为这个特定的例子分配3个字符才能工作。

阅读C Strings了解详情。

答案 1 :(得分:2)

您分配2个字节,但字符串大小为3:

'1','0','\ 0'(空终止符)在这种情况下结果是未定义的,因为你破坏了堆

此外,当你分配内存时,不要忘记最后免费拨打电话。

答案 2 :(得分:1)

您需要为空终止字符串的空字符分配空间。总共有3个字符。

同样printf(s);应该是:printf("%s", s);

答案 3 :(得分:1)

对于这段特殊代码,字符串“10”需要3个字节,即'1','0'和'\ 0'。所以你需要分配3个字节的内存。