首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Calloc导致分段错误

Calloc导致分段错误
EN

Stack Overflow用户
提问于 2011-07-23 11:19:11
回答 4查看 2.9K关注 0票数 0

下面是我的代码:

代码语言:javascript
复制
#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位数加到a (char *)。当我运行代码时,我得到了分段错误。valgrind的输出是-

代码语言:javascript
复制
==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== 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-23 11:21:46

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

请阅读C Strings以了解完整的详细信息。

票数 4
EN

Stack Overflow用户

发布于 2011-07-23 11:22:26

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-07-23 11:23:18

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6798018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档