3
int i;
char *s = (char*)malloc(sizeof(char)*10);
for(i = 0; i <= 4; ++i)
    s[i] = 'a';
s[5] = '\0';
printf("%s\n", s);
free(s).

上面的代码会不会有内存泄漏的问题?“free”函数如何知道需要释放多少内存?

4

3 回答 3

4

您的代码中没有内存泄漏。至于你的第二个问题,当你打电话时malloc,会发生更多的事情,而不仅仅是向你返回记忆。C 库保留一些空间来放置它自己的标题和簿记信息,以便在调用free它时可以做正确的事情。

关于您的代码的一些编辑说明:

  • 您不需要malloc()在 C 程序中转换返回值。void *(返回)和其他指针类型之间的转换malloc()在 C 中是隐式的。

  • sizeof(char)1,何必写出来呢?

  • 您的循环将三个字符写入s.,然后您的程序s[4]在添加\0. 这有点奇怪。你的意思是i <= 4在你的循环中使用,还是s[4] = '\0'在它之后使用?

  • 你有一个.而不是;你的free()电话。我想这只是一个错字,而不是在您的程序中,因为它不会以这种方式编译。

于 2013-01-22T02:04:27.133 回答
2

它不会泄漏。该库知道要释放多少,因为它在内部跟踪每个块的分配大小。它这样做的确切方式是一个实现细节,它可能会从一个版本malloc到另一个版本发生变化malloc,你不应该关心它。

于 2013-01-22T02:04:57.163 回答
0

不,你最后释放了 s 并且你使用的不超过 s。我会说你没事。

于 2013-01-22T02:04:39.073 回答