C代码-malloc和free
考虑以下代码:C代码-malloc和free,c,memory-management,overflow,C,Memory Management,Overflow,考虑以下代码: int main() { int *a,address,size; a= (int *) malloc(10); address=(int*) a-1; size=(int ) *(a-1); // sorry there was a bug wrong casting, now its corrected. printf("address of malloc n:%d\n",address); printf("size of mal
int main()
{
int *a,address,size;
a= (int *) malloc(10);
address=(int*) a-1;
size=(int ) *(a-1); // sorry there was a bug wrong casting, now its corrected.
printf("address of malloc n:%d\n",address);
printf("size of malloc block b:%d\n",size);
printf("before%p",a);
a=a+1;
printf("\n after%p",a);
free(a);
getch();
}
malloc“a”的地址被递增,然后被释放(a+1)。这将导致内存泄漏,但是空闲内存如何知道结束点,直到它必须释放,以便它不会错误地释放下一个内存块?是否有类似于字符数组-'\0'中的结束标记
我在K&R第8章第8.7节中读到,free维护了一个列表,从中自由意志知道要将空闲内存块添加回其中
malloc从哪个表声明它的大小?那么上面的代码将如何工作,我想这是免费列表出现在图片上的权利?它只是要添加免费的链接列表,即a+1的单词。忘记另一个会导致内存泄漏的内存位置
但是当您执行malloc()时,我看到它返回一个指针-1,并将给出分配的malloc块的大小,对吗
有人能详细解释一下吗
问题与代码无关它是Malloc和free函数如何相互作用的。如果我说free(a),free函数如何确切地知道块的结尾?可以说
free(a+1)
调用导致未定义的行为,因为a+1
从未由malloc()
等返回
仔细检查后,size=(int*)*(a-1)
行也会导致未定义的行为,因为您正在将指针解引用到分配的区域之外
内存分配机制(例如,空闲列表)是特定于实现的,除非在非常特定和非常罕见的情况下,否则不应依赖它
编辑如果您想了解一个可能的实现是如何工作的,下面介绍一个流行的
malloc()
实现:。您处于未定义行为的领域
必须根据以下标准向Free传递malloc返回的指针:
free函数使ptr指向的空间
已解除分配,即可供进一步分配。如果ptr
是空指针,不会发生任何操作。否则,如果参数
与calloc、malloc或
realloc函数,或者如果空间已通过调用
free或realloc,行为未定义
--ANSI标准1988
第4.10.3.2节:自由函数一般来说,你不能问关于C实现的各种问题。您正在对C实现进行假设,其中一些假设可能是正确的,但C标准并不能保证这些假设是正确的。也许在某些实现中,释放无效指针意味着您存在内存泄漏,也许在某些实现中,读取
malloc
返回的指针之前的4个字节将给出分配内存的大小,但这不是标准化的。您编写的代码在许多地方调用未定义和实现定义的行为。如果不知道您在谈论什么样的C实现,就不可能告诉您代码将做什么。当程序调用未定义的行为时,实现可以自由地做它想做的任何事情。一个合格的C实现可能会导致你的计算机融化成一堆热气腾腾的硅来释放一个无效的指针。会吗?不知道。代码的行为未定义
如何实现
free
和malloc
取决于实现,而不是C标准。C标准解释了这些函数的作用,根据C标准中对这些函数的描述,由每个C实现提供符合标准的free
和malloc
。无需解释。该代码在某些情况下会导致未定义的行为,任何情况都可能发生。感谢您的评论。但我的问题与代码无关。这就是Malloc和free函数如何相互作用。如果我说free(a),free函数如何确切地知道块的结尾?@PKS-我们不知道。有些人将不得不以某种方式跟踪分配情况,但语言标准没有说明如何做到这一点。或者是谁必须这么做。也许是操作系统为你做的?也许不是。是的,据我所知,是操作系统。看起来它的操作系统依赖。Thanks@PKS:我添加了一个链接到一个页面,描述了dlmalloc
,这是malloc
的一个流行实现。感谢您的评论。但我的问题与代码无关。这就是Malloc和free函数如何相互作用。如果我说free(a),free函数如何确切地知道块的结尾@PKS:malloc的实现显然是由实现定义的。@PKS这是实现的工作。实现通常必须在分配的同时存储一些额外的数据。@Ethan,只是想了解更多。。这是否意味着一个编译器中的Malloc行为与另一个编译器不同。那么,我如何理解malloc/free在我工作的每个系统上的实现呢?@PKS阅读libc的源代码。这是gcc的版本。查看并下载它。