使用strcpy拷贝字符串因分配空间不足导致漏洞

本文详细解析了C语言中strcpy函数的工作原理及潜在的问题。通过一个具体的例子展示了当目标和源字符串在内存中相邻存放时,可能会导致源字符串被截断的情况,并解释了原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

char *strcpy(char* d, const char *s)函数的功能是将把从s地址开始且含有 ‘ \0 ’ 结束符的字符串复制到以d开始的空间。

运行下面这段代码:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{
    char *a = "aa";
    char s[] = "123456789";
    char d[] = "123";
    strcpy(d,s);
    cout<<"d:"<<d<<endl;
    cout<<"s:"<<s<<endl;
    cout<<&a<<endl;
    cout<<&s<<endl;
    cout<<&d<<endl;
    return 0;
}
运行结果如下(其中地址大小每次执行可能不同):

dadada
发现d的打印结果是123456789, s的打印结果是56789

这是因为d , s的内存地址是相邻的,内存中(从0x28fefe ~ 0x28ff02 )是这样排列的 :1 2 3 \0 1 2 3 4 5 6 7 8 9 \0,

当执行strcpy(d , s)时,s的长度为10,所以内存中排列顺序变为: 1 2 3 4 5 6 7 8 9 \0 7 8 9 \0

此时打印d, 打印的是d的地址到\0之间的字符,所以打印得到d: 123456789,

打印s,类似打印的是s的地址到\0之间的字符,对比位置发现s的地址对应的字符是 5 ,所以打印出的结果 s: 56789 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林小风

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值