0

这是我的代码:

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

目的是将 2 位数字分配给 (char *)。当我运行代码时,出现分段错误。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

4 回答 4

4

您只为 2 个字符分配空间,然后将字符串 '10\0' 放入需要另一个字符来保存空 / 0 终止字符。因此,您需要为这个特定示例分配 3 个字符才能正常工作。

阅读C 字符串以获取完整的详细信息。

于 2011-07-23T03:21:46.313 回答
2

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

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

另外,在分配内存时,不要忘记最后调用 free 。

于 2011-07-23T03:22:26.250 回答
1

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

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

于 2011-07-23T03:23:18.477 回答
1

对于这段特定的代码,字符串 "10" 需要 3 个字节,分别是 '1'、'0' 和 '\0' 。所以你需要分配 3 个字节的内存。

于 2011-07-23T03:41:31.760 回答