考虑以下代码:

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)。 它会导致内存泄漏,但是如果它必须释放,那么自由将如何知道终点,以便它不会错误地释放下一块内存? Char Array中是否有任何结束标记 - '\\ 0'?

我在K&R第8章第8.7节中读到免费维护一个列表,免费知道的列表是将空闲内存块添加回来。

malloc声明的表是否有任何大小? 那么上面的代码将如何工作,我猜这是免费列表来图片对吗? 它只是添加自由链表,即只有单词+ 1。 并忘记导致内存泄漏的其他内存位置。

但是当你做一个malloc()时,我读到它返回一个指针-1并给出分配的malloc块的大小,我是对的吗?

任何人都可以详细解释这个吗?

问题与代码无关。 它的Malloc和免费功能如何相互配合。 如果我说自由(a),自由函数究竟将如何知道块的结尾?

===============>>#1 票数:3

所有可以说free(a+1)调用都会导致未定义的行为,因为malloc()等人从未返回a+1

仔细检查后, size=(int *)*(a-1)行也会导致未定义的行为,因为您要取消引用已分配区域之外的指针。

内存分配的机制(例如自由列表之类的东西)是特定于实现的,除非在非常特殊和非常罕见的情况下,否则不应该依赖它。

编辑如果您想知道可能的实现如何工作,下面是一个流行的malloc()实现的描述: dlmalloc

===============>>#2 票数:3

你处于未定义行为的范畴。

必须按照标准传递malloc返回的指针:

free函数导致ptr指向的空间被释放,即可用于进一步分配。 如果ptr是空指针,则不执行任何操作。 否则, 如果参数与之前由calloc,malloc或realloc函数返回的指针不匹配 ,或者如果通过调用free或realloc释放了空间, 则行为未定义

- ANSI标准1988

第4.10.3.2节:自由功能

===============>>#3 票数:3

一般来说,您无法询问有关C实现的各种问题。 您正在对C实现做出假设,其中一些可能是正确的,但C标准并不保证它们是真的。 也许在某些实现中,释放无效指针意味着您有内存泄漏,并且可能在某些实现中,在malloc返回指针之前读取4个字节将为您提供已分配内存的大小,但这不是标准化的。 您编写的代码在许多地方调用未定义和实现定义的行为。 在不知道您正在讨论的C实现的情况下,无法告诉您代码将执行的操作。 当程序调用未定义的行为时,实现可以自由地执行任何想做的事情。 符合C的实现可能会导致您的计算机融化成一堆热芯,以释放无效指针。 会吗? 不知道。 代码的行为未定义。

如何实现freemalloc取决于实现,而不是C标准。 C标准解释了函数的功能,并且由C标准中的这些函数的描述提供符合版本的freemalloc的每个单独的C实现。

  ask by PKS translate from so

未解决问题?本站智能推荐:

9回复

为malloc创建包装函数,并在C中免费

我试图在C中free创建包装函数和malloc ,以帮助通知我内存泄漏。 有谁知道如何声明这些函数,所以当我调用malloc()和free() ,它将调用我的自定义函数,而不是标准lib函数?
2回复

C malloc /免费腐败一般问题

这个问题类似于c malloc问题(mem腐败),但我再次提出这个问题,因为我想要比提供的更具体的信息。 所以我有一个带有一个malloc的程序,然后是一些复杂的代码,然后是一个免费的。 在复杂代码中的某处,内存被双重释放或越界写入(都在原始malloc的内存的不同区域中)破坏。 这会
2回复

malloc缓冲区溢出(C)

抱歉,如果您之前未曾回答过此问题,但我一直在疯狂地寻找答案。 我一直在使用malloc创建一个数组: 要使用户输入最多30个字符的消息: 然后,在另一个函数中,我尝试将消息转换为小写形式并将其存储在另一个字符串中(希望与消息长度相等)。 但是当我来显示新字符串时
5回复

为什么在C#中允许“long”作为数组长度?

我想尝试分配一个40亿字节的数组,这是我的C#代码: 此代码在包含new的行上的System.OverflowException失败。 好的,结果是Length返回int ,所以数组长度也限制为int可以存储的内容。 那为什么没有编译时错误,并且允许long作为分配时数组元素的数
6回复

malloc和免费问题

所以我有这段代码,我运行了几次: 在db_svnViewStatus.db我有: 但我明白了: “HEAP CORRUPTION DETECTED:在正常块(#54)之后的0x000032E90。CRT检测到应用程序在堆缓冲区结束后写入内存。” 有帮助吗? 另外
3回复

使用malloc / free的C代码中的SIGBART

我写了这个小程序,找出一个较大的字符串子串,或大海捞针的所有地方。 当我在本地运行程序时,它似乎工作正常。 但是,当我将其提交给在线竞赛进行评审时,会出现SIGBART错误。 我以为是因为内存管理不佳,所以删除了free()函数调用,但随后出现了Time Limit Exceeded错误(
5回复

减少堆栈负载,在C中分配内存,并轻松转换malloc()的返回值

众所周知,较大的局部/全局变量可能会导致堆栈溢出。 我知道使用指针和在内存中分配空间有助于解决此问题。 但这是唯一的选择吗? 如果我在全局范围内有(或需要)太多的指针会怎样? 关于堆栈空间:全局struct-type变量是占用堆栈空间还是充当指针? 是否需要创建结构变量类型的
2回复

C:这段代码如何导致释放malloc占用的空间?

我正在通过Zed Shaw的Learn C The Hard Way进行学习,并且对练习19有疑问(请参见下面的描述和链接)。 皮包骨头:在读取/输入代码时,令我惊讶的是,在程序执行开始时创建各种对象时,我们从未显式释放我们分配的内存(下面将详细介绍)。 由valgrind确认:valg
4回复

包装malloc - C.

我是C的初学者。在阅读git的源代码时,我发现了围绕malloc这个包装函数。 问题 我不明白为什么他们使用malloc(1) ? release_pack_memory做了什么,我在整个源代码中找不到这个函数实现。 #ifdef XMALLOC_POISON
6回复

C:Malloc和Free

我试图解决C函数malloc和free 。 我知道在StackOverflow上已经讨论了很多。 但是,我想我现在知道这些功能是做什么的。 我想知道为什么要使用它们。 我们来看看这段代码: 我创建了一个char类型的指针,我称之为array 。 然后我使用malloc来查找当前