回 帖 发 新 帖 刷新版面

主题:[原创]请高手指点(c语言)关于一个函数原型

原型:extern char *strcpy(char *dest,char *src);
        
  用法:#include <string.h>
  
  功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
  
  说明:[color=FF0000]src和dest所指内存区域不可以重叠[/color]且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针。
  
  举例:


      // strcpy.c
      
      #include <syslib.h>
      #include <string.h>

      main()
      {
        char *s="Golden Global View";
        char d[20];
        
        clrscr();
        
        strcpy(d,s);
        printf("%s",d);

        getchar();
        return 0;
      }


[size=4]src和dest所指内存区域不可以重叠[/size]是什么意思

回复列表 (共7个回复)

沙发

比如你要把地址0x0000-0x1000的字符串拷贝到0x0500-0x1500的地址空间中,显然两个内存区域是重叠的。

板凳

整个形象点的,比如有俩个普通班级,A班和B班,都有30人,有个音乐班有40个人,分别来自A班和B班。
现在如果我们把我们计算机的内存区域比做一个学校的话,首先肯定的是这60个人是唯一的,学校也是唯一的,但是有40个人,既是普通班的学生,也是音乐班的学生,双重身份。这在学校中是允许的,但在计算机内存中,会引起混乱,是万万不能允许的。

3 楼


我有不知道他们的地址,我怎么会知道他们的地址重复了没有。或者说在什么情况下地只会重复呢??

4 楼


我又看不见他们的地址,我怎么知道他们的地址重复了没有。或者说在什么情况下会出现地址重复呢???

5 楼

char d[20]; 很明显是在栈中 加个取地址符& 去看下就可以了 其实也就是 //地址 = 地址; 如果你是地址的话 可以加个取内容符 *

6 楼

char s[100];      比如说,有这么一段数组,这段数组里当然可以放很多个字符串.
src = &(s[50]);     src指向的是数组中50的位置
dest = &(s[51]);    dest指向的是数组中51的位置  
这样就是重叠了. src的第二字符就是dest的第一个字符.

7 楼

终于找到没有正确答案的帖子了,希望我的回答可以得到加分。

strcpy函数中,两个参数src和dest如果有区域重合将可能导致程序死掉。

举例:dest地址在0x1000,src地址在0x1200,程序在栈空间运行是从高地址向低地址,要赋值400个字节到dest中去,这样肯定会覆盖掉src中的NULL也就是‘\0’结束符,这样程序循环就失去了结束的终止条件,会无限的复制下去,直到导致整个栈空间的崩溃。所以严谨的程序在编程时建议使用strncpy函数。

我来回复

您尚未登录,请登录后再回复。点此登录或注册