免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bgifu
打印 上一主题 下一主题

[C] 去腾讯面试碰到个题目,求助一下 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-12-02 10:36 |只看该作者
原帖由 educkonline 于 2009-12-2 10:29 发表
#include
char *getMem()
{
        char *p;
        p = malloc(100);
        return p;
}

int main(void)
{
        char *p = getMem();
        char *p2 = p;
        sprintf( p, "hell ...


谁说只释放了一个字节,人家全释放了,只不过你又去读而已

论坛徽章:
0
22 [报告]
发表于 2009-12-02 10:38 |只看该作者
原帖由 雨过白鹭洲 于 2009-12-2 10:36 发表


谁说只释放了一个字节,人家全释放了,只不过你又去读而已


恩,我又重新试了一下

#include <stdio.h>
char *getMem()
{
        char *p;
        p = malloc(100);
        return p;
}

int main(void)
{
        char *p = getMem();
        sprintf( p, "hello" );
        free(p);
        sprintf(p, "hello");
        printf(p);
}

结果是hello。
我在想, 那释放掉的内存既能读,又能写,怎么算释放了呢

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
23 [报告]
发表于 2009-12-02 10:41 |只看该作者
原帖由 educkonline 于 2009-12-2 10:29 发表
#include
char *getMem()
{
        char *p;
        p = malloc(100);
        return p;
}

int main(void)
{
        char *p = getMem();
        sprintf( p, "hello" );
        free(p); ...


#include <stdio.h>
#include <malloc.h>
#include <string.h>

char* getMem()
{
    char* p = malloc( 100);
    return p;
}


int main( )
{
   char* p = getMem();
   char* p2 = p;
   sprintf( p,"hello");
   free(p);
   printf("%s\n",p2+1);
   char* p3 = getMem();
   sprintf( p3,"not hello");
   printf("%s\n",p2+1);
   free( p3);  
}

论坛徽章:
0
24 [报告]
发表于 2009-12-02 10:42 |只看该作者

回复 #22 educkonline 的帖子

地址空间里的内存你都能直接操作呢,难道你就不用分配了吗?

释放了以后就表示这块内存可以被其它部分使用了

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
25 [报告]
发表于 2009-12-02 10:44 |只看该作者
我知道了,如果malloc失败,free估计会有问题。

论坛徽章:
0
26 [报告]
发表于 2009-12-02 10:47 |只看该作者
原帖由 快乐的土豆 于 2009-12-2 10:44 发表
我知道了,如果malloc失败,free估计会有问题。


malloc失败返回NULL,你free(NULL)也没什么问题嘛

malloc失败,你对null进行sprintf肯定会报内存错误,程序直接就退出了

[ 本帖最后由 雨过白鹭洲 于 2009-12-2 10:52 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2009-12-02 10:49 |只看该作者

回复 #26 雨过白鹭洲 的帖子

printf NULL 不会报内存错误,我从来没遇到过

论坛徽章:
1
2015小元宵徽章
日期:2015-03-06 15:57:20
28 [报告]
发表于 2009-12-02 10:50 |只看该作者
原帖由 雨过白鹭洲 于 2009-12-2 10:47 发表


malloc失败返回NULL,你free(NULL)也没什么问题嘛

malloc失败,你对null进行printf肯定会报内存错误,程序直接就退出了

得,看来错误在
sprintf(p,"hello")
错误就是p == NULL.

论坛徽章:
0
29 [报告]
发表于 2009-12-02 10:51 |只看该作者
原帖由 雨过白鹭洲 于 2009-12-2 10:47 发表


malloc失败返回NULL,你free(NULL)也没什么问题嘛

malloc失败,你对null进行printf肯定会报内存错误,程序直接就退出了



printf属于手误,我说的是sprintf,就是修改NULL地址

论坛徽章:
0
30 [报告]
发表于 2009-12-02 10:59 |只看该作者
就这样跑这段代码的话没发现错误,最多就是警告!
至于潜在错误,大家到说过了
main中
使用p前没判断是否为NULL
free(p)后没给p赋为NULL
sprintf( p, "hello" )可能会造成溢出
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP