| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1604 人关注过本帖
标题:内存问题!
只看楼主 加入收藏
liqingyulipeng
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2008-10-11
结帖率:77.78%
收藏
 问题点数:0 回复次数:20 
内存问题!
各位讨论一下以下程序错在什么地方?(最好能给你的理由的出处)
    char *s1;

    if((s1=(char *)malloc(40)) == NULL)
    {
        printf("out of memory!\n");
        exit(1);
    }
    s1 = "This is string";
    printf("%s\n",s1);
    free(s1);
搜索更多相关主题的帖子: 内存 
2008-12-02 11:08
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1688
专家分:4262
注 册:2007-12-27
收藏
得分:0 
s1 = "This is string";
这句话是把原本指向malloc分配的40字节内存的指针s1修改为指向另外一处保存着如上字符串常量的内存
于是当初malloc分配的内存没有指针指向它了,于是找不到了
而s1由于现在指向的不是动态分配的内存,所以free失败

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-12-02 14:51
世纪天下城
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-11-13
收藏
得分:0 
应该没问题的,下面的程序可以运行
#include<stdio.h>
int main()
{  char *s1;
   s1=(char *)malloc(40);

    if(s1 == NULL)
    {
        printf("out of memory!\n");
        exit(1);
    }
    s1 = "This is string";
    printf("%s\n",s1);
   
    return 0;
}
2008-12-02 15:07
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
以下是引用世纪天下城在2008-12-2 15:07的发言:

应该没问题的,下面的程序可以运行
#include
int main()
{  char *s1;
   s1=(char *)malloc(40);

    if(s1 == NULL)
    {
        printf("out of memory!\n");
        exit(1);
    }
    s1 = "Th ...

不是运行结果正确就可以说你的程序正确。
你这个程序最后加一个free(s1),照样死。
根本什么都没有改。
2008-12-02 15:17
liqingyulipeng
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2008-10-11
收藏
得分:0 
同意2楼的说法。同时我又想到了另外一个问题:"This is string"这个常量字符串存在内存中的什么位置?(free是针对“堆”的操作,显然"This is string"不是存在“堆”中的)。
2008-12-02 16:35
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1688
专家分:4262
注 册:2007-12-27
收藏
得分:0 
尽管"This is string"这个常量字符串确实不在你所说的堆中,但是并不是因为这个原因才不能free的。

能不能free不在于被free的东西在不在堆中,而在于被free的东东是不是某个*alloc的产物。
例如
char *p=malloc(40);
p++;
这个p现在肯定指在堆里面,但是一样不能free

PS:那个字符串具体在哪里这个无关紧要吧

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-12-02 17:57
wang5306649
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2008-11-27
收藏
得分:0 
学习中!!
2008-12-02 18:32
raodapeng
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-11-22
收藏
得分:0 
回复 第3楼 世纪天下城 的帖子
请教三楼,exit(1)有的里面是0,有的是1,都是什么含义啊,能仔细解释一下吗,谢谢。
2008-12-02 18:32
wang5306649
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2008-11-27
收藏
得分:0 
感觉学到很多东西!!
2008-12-02 18:33
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1688
专家分:4262
注 册:2007-12-27
收藏
得分:0 
按照一般操作系统的约定,exit用来退出程序并向操作系统汇报结果,0表示正常,其它值表示不正常。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-12-02 20:48
快速回复:内存问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019056 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved