c c memset函式的陷阱

2021-07-29 21:15:17 字數 858 閱讀 8673

在c語言程式設計中,memset函式的定義是

void* __cdecl memset(

_out_writes_bytes_all_(_size) void* _dst,

_in_ int _val,

_in_ size_t _size

);

即把_dst當前位置後面的_size個位元組全部設定為 _val的ascii值, 並返回 指標_dst。

一般的用法是

int a[5] = ;

memset(a, 0, sizeof(a));

for (int i = 0; i < 5; i++)

會把陣列a的五個值都置為0;

但是要注意memset函式是按位元組賦值,所以並不能把陣列全賦值成任意的乙個值,例如如下**就有陷阱:

int a[5] = ;

memset(a, 1, sizeof(a));

for (int i = 0; i < 5; i++)

不了解memset函式的人可能會認為把a陣列的五個值都置為了1,但是前面說到memset函式是按位元組賦值

,int型的變數是四個位元組,共32位,所以會把a[0]-a[4]置為  

00000001,00000001,00000001,00000001,熟悉計算機體系結構的人會知道計算機表示數是以補碼的形式,該數的值為1+2^8+2^16+2^24=16843009,並不是1!

如果要對陣列賦除了0和-1之外的數字,建議用fill()函式。

C STL VC fread函式的陷阱

如果想實現從某個檔案中一次次n個位元組般讀出來,那建議不要用 read fread buff,n,1,data file 因為就算當檔案的位元組數比n大,但這時strlen buff 絕不是n個位元組大小!也不是read個位元組大小!查幫助文件,可知,read是指成功讀入的單元塊數,這裡對應的就是,...

虛函式的「陷阱」

首先要說明,我不是乙個理論派,很少努力的閱讀課外書籍,只是用到的時候才去找。因此理論上有缺失,導致對本文出現的 陷阱 認識不足。當然,對於一些專業知識比較強的朋友來說,這不是 陷阱 只是對我當前的知識水平而言。先舉個例子吧,更好說明情況。假設有兩個類,有兩個虛函式。if defined father...

GetTickCount 函式的陷阱!

開發中經經常使用gettickcount 函式來進行間隔時間的推斷。如推斷某一段 執行花了多少時間等,使用比較方便。可是僅僅針對尋常的一些測試。近期開發乙個服務程式時,也在 中用gettickcount 來進行推斷,大體格式例如以下 dword dwbegin 0 void thread run v...