+ -
当前位置:首页 → 问答吧 → 一个数组奇怪的问题,char str2[8], strlen(str2) ==39 。谢谢先。

一个数组奇怪的问题,char str2[8], strlen(str2) ==39 。谢谢先。

时间:2010-08-24

来源:互联网

本帖最后由 梅川内依酷 于 2010-08-24 10:33 编辑

memcpy之前的printf str2为何接了str1内容。
32位机,Linux 2.6.27
  1. #include <stdio.h>
  2. #include <string.h>


  3. int main()
  4. {
  5.     char str1[32] ={"1111111111111111111111111111119"};
  6.     char str2[8] = {"AAAAAAAy"};
  7.     printf("%d\t %d\n", sizeof(str2), strlen(str2));

  8.     printf("%s \t  %s\n", str1, str2);
  9.     memcpy(str1, str2, sizeof(str2));
  10.     printf("%s \t  %s\n", str1, str2);

  11.     memmove(str1, str2, sizeof(str2));
  12.     printf("%s \t  %s\n", str1, str2);

  13.     return  0;
  14. }
复制代码
结果:

8         39
1111111111111111111111111111119           AAAAAAAy1111111111111111111111111111119
AAAAAAAy11111111111111111111119           AAAAAAAyAAAAAAAy11111111111111111111119
AAAAAAAy11111111111111111111119           AAAAAAAyAAAAAAAy11111111111111111111119

作者: 梅川内依酷   发布时间: 2010-08-24


故意的,绝结是故意的

作者: beyond_touch   发布时间: 2010-08-24

数组没有为结尾的0保留空间

作者: hellioncu   发布时间: 2010-08-24

和楼主梅川内依酷一样,这是故意的。

作者: davelv   发布时间: 2010-08-24

回复 hellioncu


    是这样的,  我是想看越界后,str2的位置,strlen 看来很执着,一直到‘\0’,根本不关心参数的大小。

作者: 梅川内依酷   发布时间: 2010-08-24

虽然你没穿内衣裤,但是你故意调戏C版灌水众后果是很严重的

作者: daybreakcx   发布时间: 2010-08-24



QUOTE:
回复  hellioncu


    是这样的,  我是想看越界后,str2的位置,strlen 看来很执着,一直到‘\0’,根 ...
梅川内依酷 发表于 2010-08-24 10:46




    似乎你也不是不懂,strlen怎么能知道参数的大小呢

作者: hellioncu   发布时间: 2010-08-24

回复 daybreakcx


   

真没有故意的。  我是想看strlen的功能,结果让我吃惊, strlen不顾参数的长度吗?

作者: 梅川内依酷   发布时间: 2010-08-24



QUOTE:
回复  daybreakcx


     

真没有故意的。  我是想看strlen的功能,结果让我吃惊, strlen ...
梅川内依酷 发表于 2010-08-24 10:53



C语言的指针信息中不包括长度(非指针自身长度)。但是数组包括,不过你的strlen这个函数参数是指针(纯数组不能作为函数传参,但是可以包装一下),你把数组传进去,就退化为指针,它自然得不到数组长度信息。

作者: davelv   发布时间: 2010-08-24

strlen就是单纯执著地搜索着0~~~

作者: daybreakcx   发布时间: 2010-08-24



QUOTE:
回复  daybreakcx


     

真没有故意的。  我是想看strlen的功能,结果让我吃惊, strlen ...
梅川内依酷 发表于 2010-08-24 10:53




    sizeof是运算符,编译器知道你的数据类型,根据数据类型算出来的。
    strlen是函数,返回的是代码跑出来的结果。它哪知道你给的“字符串”本来是个啥。

作者: 狗气球   发布时间: 2010-08-24