gpt4 book ai didi

c - realloc 是否会改变其参数

转载 作者:行者123 更新时间:2023-12-02 12:57:55 27 4
gpt4 key购买 nike

  1. realloc 会改变它的第一个参数吗?
  2. 改变第一个参数是否取决于实现?
  3. 有什么理由不应该是const吗?作为反例,memcpy 将其 src 参数设为 const

ISO C 标准,第 7.20.3 节内存管理函数,没有指定。 realloc 的 Linux 手册页没有指定。

#include <stdio.h>
#include <stdlib.h>

int main() {
int* list = NULL;
void* mem;
mem = realloc(list, 64);
printf("Address of `list`: %p\n", list);
list = mem;
printf("Address of `list`: %p\n", list);
mem = realloc(list, 0);
printf("Address of `list`: %p\n", list);
// free(list); // Double free
list = mem;
printf("Address of `list`: %p\n", list);
}

当我在 Debian 笔记本电脑上运行上述代码时:

  • 第一个 printfnull
  • 第二个 printf 有一个地址。
  • 第三个 printf 与第二个具有相同的地址。
  • 根据规范,尝试释放地址会导致双重释放错误。
  • 第四个 printfnull

最佳答案

该函数不会更改原始指针,因为它处理的是指针的副本。即指针不是通过引用传递的。

考虑以下程序

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int *p = malloc( sizeof( int ) );
*p = 10;

printf( "Before p = %p\n", ( void * )p );

char *q = realloc( p, 2 * sizeof( int ) );

printf( "After p = %p\n", ( void * )p );

free( q );

return 0;
}

它的输出是

Before p = 0x5644bcfde260
After p = 0x5644bcfde260

如您所见,指针 p 没有改变。

但是,新指针 q 可以具有与调用 realloc 之前指针 p 相同的值。

摘自 C 标准(7.22.3.5 realloc 函数)

4 The realloc function returns a pointer to the new object (which may have the same value as a pointer to the old object), or a null pointer if the new object could not be allocated.

当然,如果你愿意写的话

    p = realloc( p, 2 * sizeof( int ) );

而不是

    char *q = realloc( p, 2 * sizeof( int ) );

那么很明显,一般来说,指针p的新值可以与p的旧值不同(尽管根据引用可以是相同的)。例如,如果函数无法重新分配内存。在这种情况下,如果指针p的初始值不等于NULL,就会发生内存泄漏。因为在这种情况下(当指针的初始值不等于NULL时),早期分配的内存的地址将会丢失。

如果新的内存区不能被释放,旧的内存不会被释放。分配是因为该函数需要将旧内容复制到新的内存范围。

摘自 C 标准(7.22.3.5 realloc 函数)

If memory for the new object cannot be allocated, the old object is not deallocated and its value is unchanged.

注意这个调用

mem = realloc(list, 0);

不一定返回NULL。

来自 C 标准(7.22.3 内存管理函数)

If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object.

关于c - realloc 是否会改变其参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57498538/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com