首页 > 试题广场 >

请问运行Test 函数会有什么样的结果?

[单选题]
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
  • 未定义行为
选择D
释放以后按照理论是不能访问的,如果这个时候访问并且往里面输入数据的话系统不能保证数据安全
所以要选择D
自己测试的时候会有可能会出现world 但不代表一直会出现world
发表于 2015-10-19 15:01:13 回复(1)
free(str)只是释放了str指针所指向的内存区域,并未修改指针本身的地址值,所以str!=NULL,但是str是一个野指针(野指针 指向一个已删除的对象或未申请访问受限内存区域的指针),访问内存区域是受限的。不过,本人在mac和linux平台上运行上述代码,虽然有警告,但是最终都输出了world。
发表于 2016-05-05 17:18:55 回复(2)
野指针D 
发表于 2015-09-19 14:02:02 回复(2)
环境:VS2010
“free(str)之后,str所指向的地址没有变化,只不过该堆空间被标记为可回收  所以str不等于NULL 继续执行就把world复制到了空间中覆盖了hello” 引用  牛客950543号 的话 到这一步之前都是正确的
出错的地方是printf  打印会运行错误
发表于 2015-09-14 12:51:17 回复(0)
Linux中man malloc可知 malloc() 源码里默认定义了一个阈值: 如果用户分配的内存小于 128 KB,则通过 brk() 申请内存; 如果用户分配的内存大于 128 KB,则通过 mmap() 申请内存;此题申请100B远远小于128 KB 字节的内存,所以使得 malloc 通过 brk()方式来分配内存。而通过 free 释放内存后,堆内存还是存在的,并没有归还给操作系统。这是因为与其把这 1 00字节释放给操作系统,不如先缓存着放进 malloc 的内存池里,当进程再次申请 1 00字节的内存时就可以直接复用,这样速度快了很多。 当然,当进程退出后,操作系统就会回收进程的所有资源。 上面说的 free 内存后堆内存还存在,是针对 malloc 通过 brk() 方式申请的内存的情况。 如果 malloc 通过 mmap 方式申请的内存,free 释放内存后就会归还给操作系统。
发表于 2023-02-05 01:08:09 回复(0)
D,出错
运行环境:VS2010

发表于 2015-09-05 17:52:50 回复(1)
D 野指针
发表于 2015-08-24 20:32:42 回复(1)
由于str告诉操作系统可以回收它所指向的内存,但是没有进行str=NULL的操作,所以str变为野指针,因此他输出的内容是遇到'\0'才会终止,VS2010运行显示答案是乱码,所以答案应该是D。
发表于 2015-09-04 22:19:35 回复(0)
gca头像 gca
B world
free(str)之后,str所指向的地址没有变化,只不过该堆空间被标记为可回收  所以str不等于NULL 继续执行就把world复制到了空间中覆盖了hello,所以打印出得结果就是world
编辑于 2015-09-18 11:40:48 回复(5)
一旦调用了 free 函数释放了内存,就不应再访问已释放的内存块,否则会导致未定义行为。因此,在释放内存后,建议将指针设置为 NULL,以避免误用。
free只是释放空间,str依然指向原来的内存空间,执行的结果可以打出world(应该)
发表于 2023-09-25 21:04:18 回复(0)
str的地址是在代码3中确定的,strcpy仅仅是将字符串copy到一开始str指向的内存中。free之后,str所存的地址还在,只是该地址指向堆区的内存被标记为可回收,此时输出时不稳定。野指针。
发表于 2022-03-16 10:19:24 回复(0)
答案:B
       调用free()之后,str指针就变成野指针,虽然内存被释放了,但是str依旧指向"hello",然后使用strcpy()函数,复制"world\0",覆盖之前“hello\0”,所以会打印出“world”。
编辑于 2015-09-04 15:39:16 回复(0)
free(str)使得str指向堆区的内存区域不受保护,野指针,所以选D,(指针本身值不会改变)
发表于 2021-03-09 13:35:53 回复(1)
记住在free了一个指针p后,下一行代码就是p=NULL; 这样可以后面如果再对指针p解引用就会报段错误而终止程序运行。否则不一定会报错,但是运行出来的结果可能就是错的
发表于 2018-06-02 13:42:09 回复(0)
str的实际地址是存在的,因为没有置为空,所以给它赋值可以打印出来,而且试了好多次都打印出来了,而野指针没有具体的实际内存,我感觉这两个还是有区别的
发表于 2015-11-24 16:43:52 回复(0)
选择B:
free后指针没有置NULL,所以进入if中,可以打印wrold
发表于 2015-09-08 17:18:58 回复(1)
虽然输出是这个结果但是还是知道正确答案选D 
发表于 2024-03-05 15:37:56 回复(0)
输出后显示未定义标识符,然后运行错误
发表于 2023-11-20 19:19:49 回复(0)
垃圾题目,printf(str);是谁报错的,没有"",应该换成puts(str);
其次,我用vm15版本编译通过了,输出world.
发表于 2023-06-10 09:30:31 回复(0)
我看了别人都是针对堆区释不释放的问题,这个printf(str)难道是对的吗,我百度了一下有的说可以有的说不可以,有人能解释一下吗
发表于 2022-12-08 11:41:41 回复(0)