我是否仍可以对具有第二个 malloc() 调用的变量调用 free()?

标签 c memory malloc

我想知道当涉及到系统如何释放内存时,malloc() 调用是否与您分配给 malloc() 的初始变量相关联。

例如,我可以执行以下操作吗:

void * ptr1 = malloc(50);
void * ptr2 = ptr1;
ptr1 = malloc(25);
free(ptr2);

我打算释放最初分配给 ptr1 的内存,但后来被另一个指针释放了。

最佳答案

让我们一步一步地过一遍(UNDEF 意味着我们不知道值是什么;valid 意味着指针可以安全使用):

void *ptr1, *ptr2;    /* ptr1=UNDEF (invalid), ptr2=UNDEF (invalid) */
ptr1 = malloc(50);    /* ptr1=0xAAA (valid),   ptr2=UNDEF (invalid) */
ptr2 = ptr1;          /* ptr1=0xAAA (valid),   ptr2=0xAAA (valid)   */
ptr1 = malloc(25);    /* ptr1=0xBBB (valid),   ptr2=0xAAA (valid)   */
free(ptr2);           /* ptr1=0xBBB (valid),   ptr2=UNDEF (invalid) */

free() 不知道它传递的指针存储在哪个if any 变量中;它不保证(但也不保证)以任何方式更新或与变量交互。从应用程序开发人员的角度来看,所有有效改变的是实际使用该指针或任何其他对在 malloc() 调用期间分配的内存块的引用是否安全返回了。

@M.M 所述in comments ,C 语言规范明确指出指向已释放对象的指针的值是未定义的,并且允许编译器以任何方式修改它;见Why does MISRA C state that a copy of pointers can cause a memory exception?进一步讨论。

关于我是否仍可以对具有第二个 malloc() 调用的变量调用 free()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52195022/

相关文章:

c - 使用十六进制数

c - 如何从 struct addrinfo 获取我自己的 IP 地址

mysql - 有关如何优化此 SQL 查询的想法

python - 如何仅加载 pickle 文件中选定的对象?

c - 总是(可移植地)释放并为进程保留内存或返回操作系统

c - 结构体初始化-C

c - 从 c 中的数组中删除一张卡片

c - 如何在 C 中读取任意长的行?

c++ - 内存映射文件 std::allocator 实现卡住 WM6 设备

c - 结构和 malloc 代码得到奇怪的输出