一道C选择题

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
未定义行为
阅读 4.1k
6 个回答

上面用汇编确实好厉害呀,但是不一定都看得懂。从C语言层分析的话,应该是这样的。

char * str = malloc(100);

malloc分配的内存指针赋给str,这段内存并未初始化,所以是非NULL的。

strcpy(str, "hello");

将"hello"拷贝到str指向的内存

free(str);

释放str指向的内存,但内存被释放后,很有可能该指针仍然指向该内存单元,此时这段内存已经不再属于这个程序,str也就是一个非NULL的悬空指针了。

后续的strcpy(str, "world"); 也就是非法操作了!所以是未定义行为。

最典型的未定义行为之一

选择world。

d str已经被释放了

你用你的电脑运行几乎所有输出都是 world 但是答案我觉得应该是 未定义

free(str) 释放str指向的那段内存,free并不会把str赋值为NULL
并不是说这段内存不存在了,只是告诉操作系统我这一段内存我这个程序不再使用。
所以当你再访问这段内存的时候他还是存在的,同时也会被操作系统捕获一个异常(现代操作系统,古老的就没有了)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进