C++之memset使用詳解及This function or variable may be unsafe錯誤

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章