| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 735 人关注过本帖
标题:一题多解 出一道最easy的题目(关于去除字符串中所有空格的,题目及样本在1 ...
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用yuccn在2014-3-5 20:50:37的发言:


char *remove_spase(char *p)
{
    // 不判断参数是否合法了
    char *pResult = (char *)malloc(strlen(p) * sizeof(char));
    char *pIndex = pResult;

    while (*p != '\0') {
        if (*p != ' ') {
            *pIndex = *p;
            pIndex++;
        }
        p++;
    }

    *pIndex = '\0'; // 漏了*
    return pResult; // 外面对其内存进行释放
}


主函数能释放子函数申请的内存???
他们都是在堆上申请的吗???

DO IT YOURSELF !
2014-03-05 20:54
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 11楼 wp231957
是的,这个没有关系的,是堆内存,他们都是使用默认的对块。
如果不同模块的就不应该这样释放了,比如一个dll申请的内存,如果有引用他的exe(或者其他的dll)来释放,那么就可能有问题了。以前我封装7z压缩库就犯过这样错误。在dll导出函数返回值带出来的内存,在调用它的模块中使用释放,结果崩溃了,当时摸不着头。 不同模块之间的内存传递,如果某模块带出一个申请的内存给外部,那么它也应该提供一个对应的释放内存的函数

[ 本帖最后由 yuccn 于 2014-3-5 21:11 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2014-03-05 21:05
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用yuccn在2014-3-5 21:05:48的发言:

是的,这个没有关系的,是堆内存,他们都是使用默认的对块。
如果不同模块的就不应该这样释放了,比如一个dll申请的内存,如果有引用他的exe(或者其他的dll)来释放,那么就可能有问题了。以前我封装7z压缩库就犯过这样错误。在dll导出函数返回值带出来的内存,在调用它的模块中使用释放,结果崩溃了,当时摸不着头。 不同模块之间的内存传递,如果某模块带出一个申请的内存给外部,那么它也应该提供一个对应的释放内存的函数
ok  了解了

以前一直认为  由调用者申请 由调用者释放  你最后的一句   “,如果某模块带出一个申请的内存给外部,那么它也应该提供一个对应的释放内存的函数”  这种情况没遇到过呢

DO IT YOURSELF !
2014-03-05 21:12
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 13楼 wp231957
windows编程常常也有这样的情况的,比如::NetScheduleJobEnum枚举计划任务时候,它带出的内存由::NetApiBufferFree来释放。这两个api都是Netapi32.dll导出的
编程多了就能够遇见了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2014-03-05 21:21
探求者
Rank: 2
等 级:论坛游民
帖 子:1
专家分:34
注 册:2014-3-5
收藏
得分:34 
#include<stdio.h>
int main(){
char test[]="this is a test string    ";
int i=0;
while(test[i]!='\0'){
  if(test[i]!=' '&&test[i]!='\0'){
     printf("%c",test[i++]);
      }
}

2014-03-05 21:22
快速回复:一题多解 出一道最easy的题目(关于去除字符串中所有空格的,题目及样 ...
数据加载中...
 
   



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

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