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”如何知道需要释放多少内存?
malloc
时,除了返回内存外,还会发生其他事情。C库保留一些空间来放置自己的头文件和簿记信息,以便在你调用 free
时可以正确处理。C程序中不需要强制转换 malloc()
的返回值。在C中,void *
(malloc()
返回的类型)与其他指针类型之间的转换是隐式的。
sizeof(char)
是 1
,为什么要写出来呢?
你的循环写入了三个字符到 s
中,然后你的程序跳过了一个字符(s[4]
),再添加 \0
。这有点奇怪。你的循环里是否应该使用 i <= 4
,或者在循环后使用 s[4] = '\0'
呢?
在你的 free()
调用后,你使用了一个 .
而不是分号 ;
。我想这只是这里的一个错别字,而不是你的程序中的错误,因为那样编译不过。
它不会泄漏内存。该库知道要释放多少内存,因为它在内部跟踪每个块的分配大小。它具体的实现方式可能会在从一个malloc
到另一个malloc
之间甚至从一个版本到另一个版本发生变化,您不应该关心它。
不,你在结尾处使用了free s,并且没有使用多个s。我认为你没问题。
sizeof(char)
是多余的。 - Seth Carnegiesizeof(char)
怎么可能是好的实践呢?它只是1
,非常简单。如果你想以后更改类型,使用sizeof *s
会更好。 - Carl Norumn
个t
类型的对象时。但你是对的,更好和更“防弹”的方法是使用sizeof(*s)
而不是sizeof(some_type)
。 - Nik Bougalis