您的位置:首页 > 编程语言 > C语言/C++

C++之memset使用详解及This function or variable may be unsafe错误

2017-10-26 13:06 387 查看

1.memset使用详解

1)void *memset(void *s,int c,size_t n)

总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

2).memset() 函数常用于内存空间初始化。如:

char str[100];

memset(str,0,100);

3).memset可以方便的清空一个结构类型的变量或数组。

如:

struct sample_struct{

char csName[16];

int iSeq;

int iType;

};

对于变量:

struct sample_strcut stTest;

一般情况下,清空stTest的方法:

stTest.csName[0]='/0';

stTest.iSeq=0;

stTest.iType=0;

用memset就非常方便:

memset(&stTest,0,sizeof(struct sample_struct));

如果是数组:

struct sample_struct TEST[10];



memset(TEST,0,sizeof(struct sample_struct)*10);

#include <mem.h>

void* memset(void* s, int c, size_t n){

unsigned char* p = (unsigned char*) s;

while (n > 0) {

*p++ = (unsigned char) c;

--n;

}

return s;

}

memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:

    void *memset(void*,int,unsigned);

  其中void*表示地址。

  例如,下面的代码用数组做参数传递给标准函数memset(),以让其将数组设置成全0:

    #include<mem.h>

    void main()

    {

     int ia1[50];

     int ia2[500];

     memset(iai,0,50*sizeof(int));

     memset(ia2,0,500*sizeof(int));

     //

    }

  memset()的第一个实参是数组名,数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。

  在函数memset()栈区,从返回地址往上依次为第1,2,3个参数。第1个参数中的内容是main()函数中定义的数组ia1的起始地址。第2个参数是给数组设置的值(0),第3个参数是数组的长度(50*2)。函数返回时,main()函数的数组中内容全置为0。

2.This function or variable may be unsafe相关错误详解

出现类似于:d:\personal\documents\visual studio 2013\projects\windows 编程\windows 编程\source.cpp(42): error C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.这样的错误。

错误原因:

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,例如将strcpy改为strcpy_s,在使用时也再查看一下MSDN详细了解。

解决方法:

方法一:将原来的旧函数替换成新的 Security CRT functions。

方法二:用以下方法屏蔽这个警告:

1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:

#define _CRT_SECURE_NO_DEPRECATE

2. 或声明 #param warning(disable:4996)

3. 更改预处理定义:

项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:

_CRT_SECURE_NO_DEPRECATE

方法三:方法二没有使用更加安全的 CRT 函数,显然不是一个值得推荐的好方法,但我们又不想一个一个地改函数名,这里还有一个更简便的方法:

在预编译头文件 stdafx.h 里(同样要在没有include任何头文件之前)定义下面的宏:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

在链接的时候便会自动将旧函数替换成 Security CRT functions 。

注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二(-_-)。即实际应在预编译头文件 stdafx.h 里加入下面两句:

#define _CRT_SECURE_NO_DEPRECATE

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: