使用scanf进行char * c时的内存泄漏

时间:2014-05-01 09:23:18

标签: c memory-leaks

请告诉我以下输入流程有什么问题?

输入应该是字符串长度,然后是字符串本身。

类似" 5 vlady"

它工作正常,但valgrind(内存泄漏工具)告诉以下异常:

  

地址0x51ef184是一个大小为4的块后的0字节' d

她的代码:

unsigned int n;
char* string;

printf("Enter your string:\n");
scanf("%d", &n);
string = (char*)calloc((n),sizeof(char));
scanf("%s", string);

谢谢!

1 个答案:

答案 0 :(得分:4)

发布的代码在分配的内存之外写入一个字节,因为scanf("%s")附加一个终止空字符。格式说明符s的说明来自C99标准的 7.19.6.2 fscanf函数部分:

  

如果不存在l长度修饰符,则相应的参数应该是指向字符数组的初始元素的指针,该元素大小足以接受序列和终止空字符,这将自动添加

因此分配n + 1个字节。

其他:

  • 始终检查IO操作的结果,以确保为变量分配了值:

    /* 'scanf()' returns number of assignments made.
       Use '%u' for reading an unsigned int. */
    if (scanf("%u", &n) == 1)
    {
    }
    
  • 通过使用scanf()格式说明符限制%Ns消耗的字节数来防止缓冲区溢出,其中N是要读取的数字字符。在这种情况下,需要使用sprintf()构造格式说明符。另一个选择是使用fgets(),但遇到空格时这不会停止读取。

  • Do I cast the result of malloc?