免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9168 | 回复: 23
打印 上一主题 下一主题

[C] 字符数组用完后内容会被自动清空吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-24 16:01 |只看该作者 |倒序浏览
我定义2个字符数组
char a[2];
char b[4];

然后分别给他们赋值
char *ptr = NULL;
char str[]="HI1234";
ptr = str;
memcpy(a,ptr,2);
printf a;
memcpy(b,ptr+2,4);
printf a;

在第一次给字符数组a赋值后,打印a的内容是正确。
可是在给b赋值后,再打印a中的内容却是空的,

这是为什么?

难道字符数组用完后内存就被释放了吗?

怎么处理能使字符数组a被赋值后内容保持着,直到下次我再次给它赋值?

[ 本帖最后由 herocsz 于 2009-8-24 16:14 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-08-24 16:06 |只看该作者
你这个牵扯问题太多了


字符串结尾、指针初始化、堆空间初始化

论坛徽章:
0
3 [报告]
发表于 2009-08-24 16:12 |只看该作者
原帖由 net_robber 于 2009-8-24 16:06 发表
你这个牵扯问题太多了


字符串结尾、指针初始化、堆空间初始化


我只是把程序简单写了一下,表达了一下意思。
主要问题还是字符数组为什么会被清空?哪里的问题呢? 谢谢!

论坛徽章:
0
4 [报告]
发表于 2009-08-24 16:27 |只看该作者
你把完整的代码扔出来

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main( void )
  4. {
  5.   char a[3];
  6.   char b[5];
  7.   char str[] = "HI1234";
  8.   char *ptr = NULL;

  9.   ptr = str;
  10.   memcpy( a, ptr, 2 );
  11.   a[2] = '\0';
  12.   printf( "%s\n", a );
  13.   memcpy( b, ptr + 2, 4 );
  14.   printf( "%s\n", a );
  15.   b[4] = '\0';
  16.   return 0;
  17. }

复制代码

这样写没有问题

[ 本帖最后由 churchmice 于 2009-8-24 16:32 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-08-24 16:34 |只看该作者
代码如下:
char        Bsic[2];
char        Rxlev[4];       
char        Arfcn[4];       
char        Cellid[5];               
char        Timeadv[2];       
char        Pwrlev[2];
char        Rxq[1];       
char        Lac[5];               
char        Tch[4];

void DataRecv(const char *rxBuf)
{
        char *ptr;

        ptr = rxBuf;

        ptr += 9;
        memcpy(Bsic, ptr, 2);
        printf("-1-bsic: %s\n", Bsic);

        ptr += 2;
        memcpy(Rxlev, ptr,  4);
        printf("-2-bsic: %s\n", Bsic);

        ptr += 9;
        memcpy(Arfcn, ptr, 4);
        printf("-3-bsic: %s\n", Bsic);

        ptr += 9;
        memcpy(Cellid, ptr, 5);
        printf("-4-bsic: %s\n", Bsic);

               ........

}

bsic的内容只有第一次是对的,其他打印的都是空

[ 本帖最后由 herocsz 于 2009-8-24 16:43 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-08-24 16:43 |只看该作者
原帖由 churchmice 于 2009-8-24 16:27 发表
你把完整的代码扔出来

#include
#include
int main( void )
{
  char a[3];
  char b[5];
  char str[] = "HI1234";
  char *ptr = NULL;

  ptr = str;
  memcpy( a, ptr, 2 );
  a[2] = '\0' ...


可是打印出来就是有问题

论坛徽章:
0
7 [报告]
发表于 2009-08-24 17:19 |只看该作者
%s,
结束符。。。

论坛徽章:
0
8 [报告]
发表于 2009-08-24 17:19 |只看该作者
楼主需要思考一个问题,字符串以什么结尾

在你的case里面,你是否有考虑字符串结尾问题

论坛徽章:
0
9 [报告]
发表于 2009-08-24 17:23 |只看该作者
原帖由 net_robber 于 2009-8-24 17:19 发表
楼主需要思考一个问题,字符串以什么结尾

在你的case里面,你是否有考虑字符串结尾问题

不加 ‘\0’, 会导致字符数组中的内容为空吗?

论坛徽章:
0
10 [报告]
发表于 2009-08-24 18:02 |只看该作者
原帖由 herocsz 于 2009-8-24 17:23 发表

不加 ‘\0’, 会导致字符数组中的内容为空吗?

不会,但数组会非法访问其它内存
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP