在学习中发现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");
}
小生不才,若有错误,不吝赐教。