我想知道当涉及到系统如何释放内存时,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/