| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1650 人关注过本帖
标题:代码是实现 strdup 函数功能的,但是有个错误,写得太渣,求指教
只看楼主 加入收藏
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
不过好像strdup确实是在内部申请了内存

总有那身价贱的人给作业贴回复完整的代码
2014-08-22 11:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用l3456在2014-8-22 11:30:54的发言:


#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 char* _sF(char* s, int len)
 {
 char* F = (char*)malloc(sizeof(char) * len);
 for(int i = 0; i < len; i++)
 {
      F = s;
 }
 F[len] = '\0';
 return F;
 free(F);//函数内释放?

不是   是由调用者释放
 }
 int main()
 {
      char *s="hello";
      char *d;
      d=_sF(s,strlen(s));
      printf("%s",d);
      return 0;
 }

DO IT YOURSELF !
2014-08-22 11:35
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 21 楼 embed_xuel
好像是改对了,运行成功后没有error框了

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-22 11:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
return后面所有语句都会被忽略

DO IT YOURSELF !
2014-08-22 11:37
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 24 楼 wp231957
那我放哪啊

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-22 11:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用l3456在2014-8-22 11:29:37的发言:

那就是 return F;free(F);?对吗


什么时候用完,什么时候free(),在外部释放。关键是自己一定要记得哪块内存没释放的,靠人脑记。不然人家发明托管模式使用垃圾回收器干什么,因为这是长期以来困扰C/C++程序员的老问题,没有有效的办法,所以才说再老练的程序员也会栽在指针上,难道你以为人家说那些很基本的错误么。这样到处释放指针还只是麻烦之一,还有更麻烦的,就是多个指针指向了同一块内存(不管是有意还是无意),都可能在释放了其中一个指针之后,用另一个指针去访问那块内存。

授人以渔,不授人以鱼。
2014-08-22 11:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
要知道。指针就如名片,你给张三和李四各发一张名片,都是你本人,但在升官发财之后,你只告诉张三(更新了名片),但没告诉李四,那么李四就会拿着过时失效的名片去找你,出错是理所当然的。当你找到这种现实的模型类比指针概念时,一切问题都可以依逻辑和理论解决,自己都想得到“为什么”。

关键是“你”,不是“你的名片”,指针没什么神秘,就因为它是间接的名片,而很多人误以为间接就是目标——用手指头指着太阳,可以找到太阳在哪里,但手指头可不是太阳,太阳不在了,手指头指哪都是错的。


[ 本帖最后由 TonyDeng 于 2014-8-22 11:56 编辑 ]

授人以渔,不授人以鱼。
2014-08-22 11:54
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 27 楼 TonyDeng
太贴切了!!!!!!受教

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-22 12:42
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
1. strdup没有控制参数len;
2. 设置F = NULL,测试函数能否正常输出;
3. 尽量别用C++编译器写C库函数。

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

char *strdup(const char *src)
{
    char *dest = (char *)malloc(strlen(src)+1);

    if (dest && src)
        strcpy(dest, src);
    return dest;
}

梦想拥有一台龙芯3A-4000
2014-08-22 17:00
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 29 楼 ditg
我也不想写!!!可是这是作业

走向光明的菜鸟学生,励志成为新一代程序猿
2014-08-22 18:59
快速回复:代码是实现 strdup 函数功能的,但是有个错误,写得太渣,求指教
数据加载中...
 
   



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

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