void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if (str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
hello
world
helloworld
未定义行为
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if (str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
hello
world
helloworld
未定义行为
你用你的电脑运行几乎所有输出都是 world
但是答案我觉得应该是 未定义
free(str)
释放str
指向的那段内存,free
并不会把str
赋值为NULL
并不是说这段内存不存在了,只是告诉操作系统我这一段内存我这个程序不再使用。
所以当你再访问这段内存的时候他还是存在的,同时也会被操作系统捕获一个异常(现代操作系统,古老的就没有了)。
上面用汇编确实好厉害呀,但是不一定都看得懂。从C语言层分析的话,应该是这样的。
malloc分配的内存指针赋给str,这段内存并未初始化,所以是非NULL的。
将"hello"拷贝到str指向的内存
释放str指向的内存,但内存被释放后,很有可能该指针仍然指向该内存单元,此时这段内存已经不再属于这个程序,str也就是一个非NULL的悬空指针了。
后续的
strcpy(str, "world");
也就是非法操作了!所以是未定义行为。