strcpy内存溢出分析以及安全函数使用


```c
#include <stdio.h>
#include <string.h>
int main()
{
    char flag = '0';
    char buf[4];
    memset(buf,0,4);

    char str[10] = "0123";

    strcpy(buf,str);
    //strncpy(buf,str,sizeof(buf));
    //strncpy_s(buf,sizeof(buf),str,sizeof(buf));

    if(0 == strcmp("123",buf))
    {
        flag = '1';
    }

    if(flag == '0')
        printf("!=\n");
    else if(flag == '1')
        printf("==\n");
    else
    {
        printf("shadow\n");
        //'\0'的ASCII 为0 ,若打印%c,没有输出
        if(flag == 0)
            printf("flag:\\0\n");
        else
            printf("flag:%c\n",flag);
    }
    printf("buf: %s\n",buf);
	if(buf[0] == 0)
        printf("buf[0]:\\0\n");
    else
    {
        for(int i = 0;i<sizeof (buf); i++)
            printf("buf[%d]: %c\n",i,buf[i]);
    }
    return 0;
}
/*
修改str变量值,对应的输出结果
strcpy
char str[10] = "123"   ==     buf:123    flag:1    buf[0]:0   buf[3]:\0   
char str[10] = "012"   !=     buf:012    flag:0    buf[0]:0   buf[3]:\0
char str[10] = "0123"  shadow buf:0123   flag:\0   buf[0]:0   buf[3]:3
char str[10] = "01234" shadow buf:01234  flag: 4   buf[0]:0   buf[3]:3

strncpy
char str[10] = "123"   ==     buf:123    flag:1    buf[0]:0   buf[3]:\0   
char str[10] = "012"   !=     buf:012    flag:0    buf[0]:0   buf[3]:\0
char str[10] = "0123"  !=     buf:0123?  flag:0    buf[0]:0   buf[3]:3

strncpy_s
char str[10] = "123"   ==     buf:123    flag:1    buf[0]:0   buf[3]:\0   
char str[10] = "012"   !=     buf:012    flag:0    buf[0]:0   buf[3]:\0
char str[10] = "0123"  !=     buf:       flag:0    buf[0]:\0 

strcpy:
当sizeof(buf)<sizeof(str),  发生内存溢出,溢出的内容赋值给变量flag,flag值修改,造成程序未知错误,同时buf数组末尾不会自动追加\0
strncpy:
当sizeof(buf)<sizeof(str),拷贝时buf遇到\0停止,并且buf数组末尾不会自动追加\0
strncpy_s:
当sizeof(buf<sizeof(str),buf拷贝'0',即buf为空串
*/

`

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

八月的雨季997

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值