0

可能重复:
realloc 和 malloc 函数

#include<stdio.h>
#include<stdlib.h>
void main()
{
  int *p;
  p = malloc(6);
  p = realloc(p, 10);
  if (p == NULL)
  {
    printf("error"); // when does p point to null consider i have enough space in prgrm
                     //memory area but not in memory where realloc is trying to search 
                     //for the memory, I dont know how to explain that try to undrstnd
   exit(1);
   }
}

以这个代码为例,假设总内存为 10 个字节,其中 2 个字节被声明为 int 类型的指针使用,另外 6 个字节由 malloc 函数占用,其余 2 个字节被其他程序占用,现在当我运行 realloc 函数时为了扩展指针指向的内存,它将在内存中搜索 10 个字节,当它不可用时,它从堆区域分配 10 个字节的内存并复制 malloc 的内容并将其粘贴到堆区域的新分配内存区域中,并且然后删除存储在malloc中的内存对吗?

realloc() 是否因为内存不可用而返回 NULL 指针?没有权利!?它确实进入堆区域进行内存分配,对吗?它不返回 NULL 指针对吗?

听我说:| 01 | 02 | 03 | 04 | 05 | 06 | 07 |08 |09 | 10 |

将其视为内存块:假设 malloc() 函数已使用 01 到 06,07 和 08 是空闲的,最后 2 个块,即 09 和 10 正在被其他程序的内存使用。现在当我调用 realloc(p,10) 我需要 10 个字节但只有 2 个空闲字节,那么 realloc 是做什么的?返回一个 NULL 指针或从堆区域分配内存并将 01 到 06 块内存的内容复制到堆区域中的该内存中,请告诉我。

4

3 回答 3

2

返回值

...

realloc() 函数返回一个指向新分配内存的指针,该指针适合任何类型的变量对齐,并且可能与 ptr 不同,如果请求失败,则返回 NULL。如果 size 等于 0,则返回 NULL 或适合传递给 free() 的指针。如果 realloc() 失败,原始块保持不变;它没有被释放或移动。

于 2012-08-25T13:58:03.557 回答
2

malloc

  1. 如果可用,这将分配内存块,否则它将返回 NULL。

重新分配

  1. 如果传递的大小大于现有块,则它将尝试扩展现有内存,如果成功扩展,它将返回相同的指针。
  2. 否则,如果它无法扩展,那么它将分配新的内存块,并将旧数据从旧内存块复制到新内存块。然后它将释放旧块并返回新块地址。
  3. 如果分配新内存块失败,那么它将简单地返回 NULL,而不释放旧内存块。
  4. 如果传递给函数的大小为零realloc,那么它将释放旧的内存块并返回 NULL。realloc(ptr, 0)相当于free(ptr)
  5. 如果传递给realloc函数的大小小于旧内存块的大小,那么它将缩小内存。

回答你的场景

听我说:| 01 | 02 | 03 | 04 | 05 | 06 | 07 |08 |09 | 10 |

将其视为内存块:假设 malloc() 已使用 01 到 06
func,07 和 08 是免费的,最后 2 个块,即 09 和 10 正在被使用
其他程序的记忆。现在当我调用 realloc(p,10) 我需要 10 个字节但是
只有 2 个空闲字节,那么 realloc 是做什么的?返回一个 NULL 指针
或者从堆区分配内存并将01的内容复制到06
内存块到堆区域中的那个内存,请告诉我。

01是的,它会将to的内容从旧内存块复制06到新内存块,然后释放旧内存块,然后返回新内存块的地址。

于 2012-08-25T15:00:33.263 回答
0

实现的方式malloc 是根据定义系统或实现依赖的。(一个愚蠢但符合标准的实现malloc总是会因返回而失败NULL;大多数真正的实现都比这更好)。

首先阅读mallocreallocfree(Posix 标准)的行为规范。

于 2012-08-25T13:58:08.187 回答