标题:关于strcpy函数的溢出问题
只看楼主
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
结帖率:100%
已结贴  问题点数:20 回复次数:3 
关于strcpy函数的溢出问题
以下是我的程序,当我把arr2[15]改成arr2[14]时会打印空行
#include <stdio.h>
#include <string.h>
//字符串拷贝函数string copy :strcpy(destination,source);
//  内存设置函数memory set  :memset(point,value,num);
    int main()
    {
        char arr1[]="Hello,Remained";//内涵Hello/0 :/0是结束符所以覆盖后没显示yWorld,直接终止了打印
        char arr2[15]="ByeBey World!";
        printf("定义arr1:%s\n",arr1);
        printf("定义arr2:%s\n",arr2);        
        strcpy(arr2,arr1);//strcpy(被覆盖对象,覆盖所用资源)把arr1的字符串放arr2里了  
        printf("将arr1覆盖arr2后显示arr2:%s\n",arr2);//显示:Hello,Remained
        //如果arr1 比arr2的字符串数多,就不能显示arr1了,因为溢出了
        printf("arr1覆盖arr2后显示arr1:%s\n",arr1);//显示:*****,Remained         
        
        memset(arr1,'*',5); //指向的字符串对象,需要配置的内容,数量
        printf("将5个*配置给arr1后,打印arr1:%s\n",arr1);//显示:*****,Remained
        return 0;
    }
arr1[14]时编译效果如下:

定义arr1:Hello,Remained
定义arr2:ByeBey World!
将arr1覆盖arr2后显示arr2:Hello,Remained
arr1覆盖arr2后显示arr1:
将5个*配置给arr1后,打印arr1:*****,Remained

--------------------------------
Process exited after 0.0373 seconds with return value 0
请按任意键继续. . .

arr[15]时编译效果如下:

定义arr1:Hello,Remained
定义arr2:ByeBey World!
将arr1覆盖arr2后显示arr2:Hello,Remained
arr1覆盖arr2后显示arr1:Hello,Remained
将5个*配置给arr1后,打印arr1:*****,Remained

--------------------------------
Process exited after 0.03908 seconds with return value 0
请按任意键继续. . .




   

   
搜索更多相关主题的帖子: strcpy 函数 定义 Hello 显示 
2022-02-21 15:40
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
得分:0 
用的Dev C++这个软件写的,想知道为什么打印空行,而不是打印一部分
2022-02-21 15:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
arr1[14]时编译效果如下:
这种重要的信息,你应该直接写在代码中,而不是先写个不是你想展现给别人的代码,然后再让别人改成你需要展现的代码。
我举个例子:
A: 我说1+2=3,大家都嘲笑我
B: 你说的没错呀
A: 请把我刚才说的那句话中的3改为250
B:为什么不直接说“我说1+2=250,大家都嘲笑我”?

strcpy(arr2,arr1);
若arr1的字符串长度(包括终止字节)大于arr2的数组长度,则行为未定义
给你C语言标准中的规定看看
char* strcpy( char* restrict dest, const char* restrict src );
复制 src 所指向的空终止字节字符串,包含空终止符,到首元素为 dest 所指的字符数组。
若 dest 数组长度不足则行为未定义;若字符串覆盖则行为未定义;若 dest 不是指向字符数组的指针或 src 不是指向空终止字节字符串的指针则行为未定义。

而关于什么是“行为未定义”或“未定义行为”,你可以在网上搜一下,大体是编译器遇到这种脑残代码,但编译器却又无法以“无额外代价的方式”解决,那就不管了,一切都不保证,既不保证一定正确,也不保证一定错误,也不保证每次输出一致。很久之前,gcc1.x 遇到未定义行为就直接开启本机的游戏,这种行为是符合C语言标准规定的。
收到的鲜花
  • Remained2022-02-22 15:52 送鲜花  1朵  
2022-02-22 08:39
Remained
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2022-2-21
得分:0 
回复 3楼 rjsp
感谢大哥!受教了!
2022-02-22 15:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508398-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024202 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved