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

来源:互联网 发布:php类的反射 编辑:程序博客网 时间:2024/06/05 08:02

在学习中发现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");}

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

1 0
原创粉丝点击