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

本页主题: 关于C中的字符串指针的拷贝 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

jasper





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

5come5帮你背单词 [ gift /gift/ n. 赠品,礼物,天赋,才能 ]


关于C中的字符串指针的拷贝

以前用strcpy在字符串指针间拷贝的时候经常出错
数组太不好用了,要显示指定字符串长度。
最近才发现原来是没有对字符串分配内存的原因。

例:
#include <stdio.h>
#include <stdlib.h>

int main()
{
  char *ch = "hello world";
  char *ch2;
  ch2 = (char *)malloc(strlen(ch));  /* 如果没有显示分配内存,则拷贝将失败 */
  strcpy(ch2, ch);
  printf("%s\n",ch2);
  return 0;
}

不知道以前兄弟们有没有遇到过这种情况,一点小小的经验和大家分享
顶端 Posted: 2007-08-12 15:04 | [楼 主]
zhoubaozhou





性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 696
威望: 0
浮云: 1082
在线等级:
注册时间: 2007-03-13
最后登陆: 2023-01-26

5come5帮你背单词 [ decent /'di:snt/ a. 庄重的,正派的,大方的,(服装等)相称的,体面的 ]


ch2 = (char *)malloc(strlen(ch));  /* 如果没有显示分配内存,则拷贝将失败 */
要判断申请内存成功了没有
还有退出时要free(ch2);
虽然操作系统在程序退出时会自动回收内存,但是在程序运行时记得要回收


[ 此贴被zhoubaozhou在2007-08-13 12:20重新编辑 ]
顶端 Posted: 2007-08-12 16:07 | [1 楼]
枫林醉



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 108
威望: 0
浮云: 1121
在线等级:
注册时间: 2005-10-01
最后登陆: 2008-06-30

5come5帮你背单词 [ kilometer /'kiləmi:tə/ n. 千米,公里 ]


只声明指针不会主动分配内存
顶端 Posted: 2007-08-13 12:08 | [2 楼]
carwin





性别: 保密 状态: 该用户目前不在线
等级: 品行端正
发贴: 189
威望: 0
浮云: 1204
在线等级:
注册时间: 2006-09-17
最后登陆: 2014-02-11

5come5帮你背单词 [ information // n. 信息,数据,情报,资料,消息,通知 ]


提醒一下!!!!!!!
ch2 = (char *)malloc(strlen(ch));  是错的!!!!!

正确应该为:
ch2 = (char *)malloc(strlen(ch)+1);

否则,你可能在某些情况下遭遇不可预知的错误!!!!
应该多分配一个空间来放'\0’  !!!!!
本帖最近评分记录:
  • 浮云:5(est) 优秀讨论
  • 顶端 Posted: 2007-08-14 00:40 | [3 楼]
    carwin





    性别: 保密 状态: 该用户目前不在线
    等级: 品行端正
    发贴: 189
    威望: 0
    浮云: 1204
    在线等级:
    注册时间: 2006-09-17
    最后登陆: 2014-02-11

    5come5帮你背单词 [ jeans /d3əeinz/ n. 工装裤,牛仔裤 ]


    在次提醒一下!!
    char *ch = "hello world";

    这种写法不是太好,因为这样的话,ch将指向一个常量字符串。如果下面你有对ch字串的修改的话,将看你的人品啦,极可能会引发访问异常,或不可预知的错误。

    一般这样申明一个字串比较好。
    char ch[]="hello world";
    顶端 Posted: 2007-08-14 00:45 | [4 楼]
    carwin





    性别: 保密 状态: 该用户目前不在线
    等级: 品行端正
    发贴: 189
    威望: 0
    浮云: 1204
    在线等级:
    注册时间: 2006-09-17
    最后登陆: 2014-02-11

    5come5帮你背单词 [ crop /krop/ n. 庄稼,农作物,收成,一季的产量,一批,一群;vt. 收割,播种;vi. 收成,耕种 ]


    再再次提醒一下!!!!

    ch2 = (char *)malloc(strlen(ch)); 这句之后,一定要加上判断语句

    if(NULL==ch2) exit();

    //当你人品差到极点的时候,malloc是会分配失败,返回NULL的。
    否则,你将可能调试几天,而依然出现不可预知的错误,而令你崩溃的。
    顶端 Posted: 2007-08-14 00:50 | [5 楼]
    albert





    性别: 保密 状态: 该用户目前不在线
    等级: 栋梁之材
    家族: 唯war独尊
    发贴: 634
    威望: 0
    浮云: 1116
    在线等级:
    注册时间: 2005-10-04
    最后登陆: 2012-02-12

    5come5帮你背单词 [ plateau /'plætəu/ n. 高原 ]


    一般用strcpy都是数组与数组之间的拷贝,因此不存在LZ的问题。
    顶端 Posted: 2007-08-14 20:07 | [6 楼]
    我来我网·5come5 Forum » 程序员之家

    Total 0.010272(s) query 5, Time now is:11-27 04:59, Gzip enabled
    Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号