【问题标题】:Calloc causing segmentation faultCalloc 导致分段错误
【发布时间】:2011-07-23 03:19:10
【问题描述】:

这是我的代码:

#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== 

【问题讨论】:

    标签: c segmentation-fault calloc dynamic-allocation


    【解决方案1】:

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

    阅读C Strings 了解完整详情。

    【讨论】:

      【解决方案2】:

      你分配了 2 个字节,但字符串大小是 3:

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

      另外,在分配内存的时候,别忘了最后调用free。

      【讨论】:

      • 另一种解决方案(仅适用于这种情况)是sprintf(s, "%X", n); ;-P
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-06
          • 2020-12-31
          • 2019-07-21
          • 2018-07-28
          • 2014-04-25
          相关资源
          最近更新 更多