对于VS中一些较严谨的(_s)函数如strcpy_s的第二个参数的问题

1 篇文章 0 订阅
0 篇文章 0 订阅

在学习中发现strcpy_s中第二个参数不能随便写。开始我碰到这个比较严谨的函数时我故作聪明,将第二个参数使用strlen()代替。但拿不严谨的小聪明去解决严谨的函数问题必然问题一大堆。
今天这一个问题烦了我很久,后来才发现是不懂strcpy_s函数第二个参数的含义。下面这程序是野指针的例子。

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

void main()
{
    char *p1 = NULL;
    p1 = (char *)malloc(100);
    if (p1 == NULL)
    {
        return;
    }
    strcpy_s(p1, sizeof("11112222") + 1, "11112222");
    //1.strcpy_s(char *strDestination,size_t numberOfElements,const char *strSource);第二个参数表示目标缓冲区大小,大于或等于源串的长度+1(存放结束符'/0')。如果没有第二个参数,就没有方法来保证有效的缓冲区尺寸,不然只能假定缓冲足够大来容纳要拷贝的字符串(strcpy函数)。在程序运行时,这将导致不可预料的行为。
    //2.如果缓冲区过小会报错:buffer is too small。只需把第二个参数设置成合适的就好了。
    //之前我错误地一贯写成「strcpy_s(p1,strlen(p1),"11112222")」。后来改成sizeof("11112222")就报错2了。

    printf("p1:%s\n", p1);

    if (p1 != NULL)
    {
        free(p1);
        p1 = NULL;
    }

    if (p1 != NULL)
    {
        free(p1);
    }

    system("pause");
}

小生不才,若有错误,不吝赐教。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值