在C++中,获取无效指针的值是一种实现定义的行为,参考此处。现在考虑以下C程序:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* p=(int*)malloc(sizeof(int));
*p=3;
printf("%d\n",*p);
printf("%p\n",(void*)p);
free(p);
printf("%p\n",(void*)p); // Is this undefined or implementation defined in behaviour C?
}
但是在C语言中,行为是否相同?上述C程序的行为是未定义的还是实现定义的?C99/C11标准对此有何规定? 请告诉我C99和C11中的行为是否不同。
malloc
返回的值。对于你的问题,我不知道是否有规定,但是free
不会改变p
的内容。随时读取(或更改)它的内容都是有效的,就像任何变量一样(当然,前提是它已经被初始化,这在这里是成立的)。唯一禁止的操作是解除其值的引用,就好像它已经被释放一样。 - hexasoftmalloc()
实现使用mmap()
来满足malloc()
请求,那么在调用free()
时它很可能会munmap()
指针地址的内存。该指针很可能包含无效地址。 - Andrew Henle