订单王
2011-11-15 20:40
浏览 454
已采纳

strcpy函数在linux上执行异常,在windos执行OK

代码如下:

    char a[5];
    char b[5];
    printf("point a=%d\n",&a);
    printf("point b=%d\n",&b);
    memset(a,0x00,sizeof(a));
    memset(b,0x00,sizeof(b));
    char * tmp1="123456789";
    char * tmp2="abcde";
    strcpy(a,tmp1);
    strcpy(b,tmp2);
    printf("point a=%d,a=%s\n",&a,a);
    printf("point b=%d,b=%s\n",&b,b);

 该代码在window上执行成功的。gcc版本:gcc version 3.4.2 (mingw-special)

 

在ubuntu上执行报段错误,gcc版本:gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

ubuntu版本:Linux ubuntu 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux

 

其中在ubuntu上执行报错的是在第二个strcpy(b,tmp2)的地方。

请各位帮忙给看看。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 爱上一条鱼 2011-11-15 22:44
    已采纳

    [code="java"]point a=2293568
    point b=2293552[/code]
    我刚试了下,windows底下好像默认给分配了16字节的数组大小,比如你再定义一个char[5] c; 那么地址应该还是2293552-16 其实还是连续的,这个不是C语言本身的问题,应该是操作系统或者是编译器的差异引起的。

    另外 下面这段代码里,b会把a给覆盖掉的。
    [code="java"]#include
    #include
    int main() {
    char a[5];
    char b[5];
    printf("point a=%d\n",&a);
    printf("point b=%d\n",&b);
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    char * tmp1="12345";
    char * tmp2="abcdefghijklmlopqrstuvwxyz";

    strcpy(a,tmp1);
    strcpy(b,tmp2);
    
    printf("point a=%d,a=%s\n",&a,a);
    printf("point b=%d,b=%s\n",&b,b);
    

    }[/code]

    点赞 打赏 评论
  • 爱上一条鱼 2011-11-15 20:57

    [code="java"] char a[5];
    char b[5];
    printf("point a=%d\n",&a);
    printf("point b=%d\n",&b);
    memset(a,0x00,sizeof(a));
    memset(b,0x00,sizeof(b));
    char * tmp1="123456789";
    char * tmp2="abcde";
    strcpy(a,tmp1);
    strcpy(b,tmp2);
    printf("point a=%d,a=%s\n",&a,a);
    printf("point b=%d,b=%s\n",&b,b);[/code]

    这段代码不是果断内存溢出了嚒。。。出错正常的
    你定义的长度a,b是5,但是tmp1、tmp2长度都超了,所以溢出的部分你不知道会在内存哪里,有可能修改了其他程序的内存,反正就挂了。。。

    点赞 打赏 评论
  • 爱上一条鱼 2011-11-15 21:01

    strcpy的原型代码实现是
    [code="java"]char *strcpy(char *strDestination, const char *strSource)
    {
      assert(strDestination && strSource);
      char *strD=strDestination;
      while ((*strDestination++=*strSource++)!='\0')
      NULL;
      return strD;
    }[/code]
    是不会判断strDestination的大小的,直接while循环到strSource的字符为'\0'为止。

    [url]http://baike.baidu.com/view/1026861.htm[/url]

    点赞 打赏 评论
  • 爱上一条鱼 2011-11-15 22:19

    [quote]这两个地址的差刚好是5,能不能说明内存中是连续分配的呢?[/quote]
    ab两个数组是局部变量 ,是放在内存的栈里的,是依次压入栈的,所以按道理必然是连续的

    [code="java"]
    point a=-1080353325
    point b=-1080353330[/code]
    栈(stack)的地址值是倒着来的,先定义的压入底部

    对于C来说,理解内存这块是很重要的。刚搜了几篇,你也可以找一些教材或者网上再搜搜“C语言 内存”找些资料看看
    [url]http://my.oschina.net/hengcai001/blog/470[/url]
    [url]http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/[/url]
    [url]http://www.iteedu.com/myarticle/plang/ccpp/cpointmemory.php[/url]

    点赞 打赏 评论

相关推荐 更多相似问题