【问题标题】:memory leakage while using scanf for char* c将scanf用于char * c时发生内存泄漏
【发布时间】:2014-05-01 09:23:17
【问题描述】:

你能告诉我以下输入过程有什么问题吗?

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

类似“5 vlady”的东西

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

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

她的密码:

unsigned int n;
char* string;

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

谢谢!

【问题讨论】:

    标签: c memory-leaks


    【解决方案1】:

    由于scanf("%s") 附加了一个终止空字符,因此发布的代码正在超出分配的内存写入一个字节。来自 C99 标准的 7.19.6.2 fscanf 函数 部分的格式说明符 s 的描述:

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

    因此分配n + 1字节。

    其他:

    • 始终检查 IO 操作的结果以确保变量已被赋值:

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

    • Do I cast the result of malloc?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 2018-10-09
      • 1970-01-01
      • 2021-11-01
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多