我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

« 1 2» Pages: ( 1/2 total )
本页主题: [c]为什么不做这个[屏蔽]作就会出错呢? 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

springdew



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 936
威望: 0
浮云: 0
在线等级:
注册时间: 2005-12-29
最后登陆: 2019-06-20

5come5帮你背单词 [ translation /træns'leiən/ n. 翻译,译文,译文 ]


[c]为什么不做这个[屏蔽]作就会出错呢?

本帖被 zhd32 执行提前操作(2007-11-26)
RT:

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"

int main()
{
    int i;   
    unsigned char * newp;   
    unsigned long highresult=0x12345678;

    newp=(unsigned char *)malloc(4*sizeof(unsigned long));
    if (NULL==newp)
    {
        printf("NUll!!!!!!!");
    }   
    else
    {
              newp=(char *)&highresult;       
    }

    for(i=0;i<4;i++)
    {
        printf("%02x\n",*newp);
        newp++;
    }

    newp=NULL;      //为什么不做这个操作就会出错呢?

    free(newp);   
    return 0;
}


[ 此帖被springdew在2007-11-23 13:17重新编辑 ]
顶端 Posted: 2007-11-23 13:06 | [楼 主]
yinx



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 丢丢
发贴: 2333
威望: 0
浮云: 1260
在线等级:
注册时间: 2006-09-15
最后登陆: 2009-05-11

5come5帮你背单词 [ alliance /ə'laiəns/ n. 结盟,联盟,联姻 ]


newp是malloc出来的空间的头指针,不是可以随意改变它的值的。

改变了它的值再free也是没有任何意义的,那个申请的空间还占着内存。

至于加了newp=NULL;之后不出错是因为free函数对传入的参数作了检查,如果NULL不作处理而直接退出。

如果没有这一句,当时的newp的值就不是一个malloc出来的空间的头指针,free它的话就会出错。
本帖最近评分记录:
  • 浮云:5(zhd32) 正解~~
  • 顶端 Posted: 2007-11-23 13:39 | [1 楼]
    dream46



    性别: 帅哥 状态: 该用户目前不在线
    等级: 品行端正
    发贴: 438
    威望: 0
    浮云: 1111
    在线等级:
    注册时间: 2005-11-13
    最后登陆: 2011-04-07

    5come5帮你背单词 [ initial /i'niəl/ a. 最初的,开始的;n. 首字母 ]


    lz你的程序在newp=(char *)&highresult 就有错阿
    顶端 Posted: 2007-11-23 13:40 | [2 楼]
    dream46



    性别: 帅哥 状态: 该用户目前不在线
    等级: 品行端正
    发贴: 438
    威望: 0
    浮云: 1111
    在线等级:
    注册时间: 2005-11-13
    最后登陆: 2011-04-07

    5come5帮你背单词 [ traveller /'trævlə/ n. 旅行者,旅客 ]


    Quote:
    引用第2楼dream46于2007-11-23 13:40发表的  :
    lz你的程序在newp=(char *)&highresult 就有错阿

    newp++; 改变了原有的指针式不行的
    顶端 Posted: 2007-11-23 13:41 | [3 楼]
    springdew



    性别: 帅哥 状态: 该用户目前不在线
    等级: 栋梁之材
    发贴: 936
    威望: 0
    浮云: 0
    在线等级:
    注册时间: 2005-12-29
    最后登陆: 2019-06-20

    5come5帮你背单词 [ shrimp /rimp/ n. 虾 ]


    Quote:
    引用第1楼yinx于2007-11-23 13:39发表的  :
    newp是malloc出来的空间的头指针,不是可以随意改变它的值的。

    改变了它的值再free也是没有任何意义的,那个申请的空间还占着内存。

    至于加了newp=NULL;之后不出错是因为free函数对传入的参数作了检查,如果NULL不作处理而直接退出。
    .......

    哦,明白了.谢谢!
    顶端 Posted: 2007-11-23 16:15 | [4 楼]
    springdew



    性别: 帅哥 状态: 该用户目前不在线
    等级: 栋梁之材
    发贴: 936
    威望: 0
    浮云: 0
    在线等级:
    注册时间: 2005-12-29
    最后登陆: 2019-06-20

    5come5帮你背单词 [ endurance /in'djuərəns/ n. 忍耐(力),持久性 ]


    Quote:
    引用第3楼dream46于2007-11-23 13:41发表的  :

    newp++; 改变了原有的指针式不行的

    newp=(char *)&highresult
    强制类型转换,我觉得可以的
    newp++为什么不可以呢?
    顶端 Posted: 2007-11-23 16:17 | [5 楼]
    再不斩



    性别: 帅哥 状态: 该用户目前不在线
    等级: 鹤立鸡群
    发贴: 1414
    威望: 0
    浮云: 1413
    在线等级:
    注册时间: 2005-12-23
    最后登陆: 2009-04-26

    5come5帮你背单词 [ aboard /ə'bo:d/ ad. & prep. 在船(车、飞行器)上,上船(车、飞行器) ]


    Quote:
    引用第1楼yinx于2007-11-23 13:39发表的  :
    newp是malloc出来的空间的头指针,不是可以随意改变它的值的。

    改变了它的值再free也是没有任何意义的,那个申请的空间还占着内存。

    至于加了newp=NULL;之后不出错是因为free函数对传入的参数作了检查,如果NULL不作处理而直接退出。
    .......

    那这岂不是要浪费内存?不作处理直接退出。。。
    应该有个不变的指针,便于后来释放吧。
    顶端 Posted: 2007-11-23 19:48 | [6 楼]
    再不斩



    性别: 帅哥 状态: 该用户目前不在线
    等级: 鹤立鸡群
    发贴: 1414
    威望: 0
    浮云: 1413
    在线等级:
    注册时间: 2005-12-23
    最后登陆: 2009-04-26

    5come5帮你背单词 [ department /di'pa:tmənt/ n. 部,部门,系 ]


    Quote:
    引用第3楼dream46于2007-11-23 13:41发表的  :

    newp++; 改变了原有的指针式不行的

    LZ回去看课本。
    顶端 Posted: 2007-11-23 19:48 | [7 楼]
    木村心野



    贝尔诺勋章 灌水天才奖
    性别: 帅哥 状态: 该用户目前不在线
    头衔: 生命不在于活得长与短,而在于 ..
    等级: 荣誉会员
    家族: 丢丢
    发贴: 42396
    威望: 4
    浮云: 430
    在线等级:
    注册时间: 2005-10-17
    最后登陆: 2010-11-28

    5come5帮你背单词 [ acrobatics /ækrə'bætiks/ n. 杂技 ]


    如果不把指针至于NULL的话,这个指针就会成为一个野指针,
    造成内存的泄露
    顶端 Posted: 2007-11-23 21:34 | [8 楼]
    zhd32



    性别: 帅哥 状态: 该用户目前不在线
    等级: 版主
    家族: YD一族
    发贴: 619
    威望: 0
    浮云: 543
    在线等级:
    注册时间: 2006-04-22
    最后登陆: 2009-06-22

    5come5帮你背单词 [ england /'iŋglənd/ n. 英格兰,(泛指)英国 ]


    free利用了一个结构体(不同的实现可能不一样啊,但是肯定是在内存中标记了这块内存是否被free了)
    Copy code
    typedef struct mblock {
        unsigned char isavailable;
        void *pmem;
    };

    void free(void *pmemblock) {
        if (free != NULL) {
            //会将 isavailable 设为 1(OR 0????)
        }
    }
    顶端 Posted: 2007-11-23 21:41 | [9 楼]
    依然随意



    性别: 帅哥 状态: 该用户目前不在线
    等级: 前途无量
    家族: ⊙JAY菊爱园⊙
    发贴: 5922
    威望: 0
    浮云: 760
    在线等级:
    注册时间: 2006-09-25
    最后登陆: 2022-10-30

    5come5帮你背单词 [ horizontal /hori'zontl/ a. 水平线,地平线的 ]


    我感觉这程序存在内存泄漏,
    newp=(unsigned char *)malloc(4*sizeof(unsigned long));这条语句分了存储区,
    然后newp=(char *)&highresult;结果newp又指向了highresult这个静态的变量,
    如果后面直接free(newp)就相当于释放静态存储区,那是不可能的,所以要newp=NULL。
    顶端 Posted: 2007-11-24 10:45 | [10 楼]
    zhd32



    性别: 帅哥 状态: 该用户目前不在线
    等级: 版主
    家族: YD一族
    发贴: 619
    威望: 0
    浮云: 543
    在线等级:
    注册时间: 2006-04-22
    最后登陆: 2009-06-22

    5come5帮你背单词 [ undergo /Λndə'gəu/ vt. 经历,忍受 ]


    Quote:
    引用第10楼依然随意于2007-11-24 10:45发表的  :
    我感觉这程序存在内存泄漏,
    newp=(unsigned char *)malloc(4*sizeof(unsigned long));这条语句分了存储区,
    然后newp=(char *)&highresult;结果newp又指向了highresult这个静态的变量,
    如果后面直接free(newp)就相当于释放静态存储区,那是不可能的,所以要newp=NULL。

    GG说的是对的
    LZ问的是为什么会出错,内存泄露在这里不会出错
    顶端 Posted: 2007-11-24 11:46 | [11 楼]
    依然随意



    性别: 帅哥 状态: 该用户目前不在线
    等级: 前途无量
    家族: ⊙JAY菊爱园⊙
    发贴: 5922
    威望: 0
    浮云: 760
    在线等级:
    注册时间: 2006-09-25
    最后登陆: 2022-10-30

    5come5帮你背单词 [ satisfaction /sætis'fækən/ n. 卫星,人造卫星,附庸国 ]


    Quote:
    引用第11楼zhd32于2007-11-24 11:46发表的  :

    GG说的是对的
    LZ问的是为什么会出错,内存泄露在这里不会出错

    我就说呀,如果没newp=NULL,那么newp将指向静态存储区,free()一个并非是malloc()生成的存储区,当然出错。
    顶端 Posted: 2007-11-24 12:06 | [12 楼]
    abcd0106





    性别: 帅哥 状态: 该用户目前不在线
    等级: 鹤立鸡群
    发贴: 1093
    威望: 0
    浮云: 1049
    在线等级:
    注册时间: 2005-10-08
    最后登陆: 2009-04-04

    5come5帮你背单词 [ accordance /ə'ko:dəns/ n. 一致,相符 ]


    Quote:
    引用第9楼zhd32于2007-11-23 21:41发表的  :
    free利用了一个结构体(不同的实现可能不一样啊,但是肯定是在内存中标记了这块内存是否被free了)
    [code]
    typedef struct mblock {
        unsigned char isavailable;
        void *pmem;
    .......


    想问一下怎么弄到c库函数源码的。。
    顶端 Posted: 2007-11-24 20:18 | [13 楼]
    zhd32



    性别: 帅哥 状态: 该用户目前不在线
    等级: 版主
    家族: YD一族
    发贴: 619
    威望: 0
    浮云: 543
    在线等级:
    注册时间: 2006-04-22
    最后登陆: 2009-06-22

    5come5帮你背单词 [ scrub /skrΛb/ vt. 用力擦洗;n. 擦洗,擦净 ]


    Quote:
    引用第13楼abcd0106于2007-11-24 20:18发表的  :


    想问一下怎么弄到c库函数源码的。。

    这个是我以前在哪看到的,大概是这个样子

    开源的 glibc 很不错~
    VS的C库函数源码在 \VC\crt\src
    顶端 Posted: 2007-11-24 20:27 | [14 楼]
    « 1 2» Pages: ( 1/2 total )
    我来我网·5come5 Forum » 程序员之家

    Total 0.017338(s) query 7, Time now is:06-16 18:37, Gzip enabled
    Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号