1. 程式人生 > 其它 >Thread和Runnable

Thread和Runnable

memset 函式宣告為:

void *memset(void *str, int c, size_t n)

將 str 中當前位置後面的 n 個位元組 (typedef unsigned int size_t )用 c 替換並返回 str 。

memset 一般使用“0”初始化記憶體單元,通常是給陣列或結構體進行初始化,或清空陣列或結構體。

需要注意的是:memset函式按位元組對記憶體塊進行初始化,所以不能用它將 int 陣列初始化為 0-1 之外的其他值。

int a[10];
	memset(a, 1, sizeof(a));
	for (auto i : a)
		cout << i << " ";

上面程式碼將會輸出:

原因:

這是因為memset是以位元組為單位來完成賦值的,而一個int有四個位元組,也就是說在上面的例子中其實我們賦的值是十六進位制的0x01010101,即二進位制數0000 0001 0000 0001 0000 0001 0000 0001,換算成十進位制為16843009,最終得出我們上面的結果。因此如果我們想將陣列置為我們要的十進位制值,只能置為0或-1,因為0的二進位制表示全為0,-1的二進位制表示全為1,按位元組為單位完成賦值的結果可以保持不變。

注意:

1.陣列也可以直接進行初始化,但 memset 是對較大的陣列或結構體進行清零初始化的最快方法,因為它是直接對記憶體進行操作的。

2.memset 函式的第三個引數 n 的值一般用 sizeof()  獲取,這樣比較專業。注意,如果是對指標變數所指向的記憶體單元進行清零初始化,那麼一定要先對這個指標變數進行初始化,即一定要先讓它指向某個有效的地址。而且用memset給指標變數如p所指向的記憶體單元進行初始化時,n 千萬別寫成 sizeof(p),這是新手經常會犯的錯誤。因為 p 是指標變數,不管 p 指向什麼型別的變數,sizeof(p) 的值都是 4。

# include <stdio.h>
# include <string.h>
int main(void)
{
    int i;  //迴圈變數
    char str[10];
    char *p = str;
    memset(str, 0, sizeof(str));  //只能寫sizeof(str), 不能寫sizeof(p)
    for (i=0; i<10; ++i)
    {
        printf("%d\x20", str[i]);
    }
    printf("\n");
    return 0;
}

根據memset函式的不同,輸出結果也不同,分為以下幾種情況:
memset(p, 0, sizeof(p));  //地址的大小都是4位元組
0 0 0 0 -52 -52 -52 -52 -52 -52

memset(p, 0, sizeof(*p));  //*p表示的是一個字元變數, 只有一位元組
0 -52 -52 -52 -52 -52 -52 -52 -52 -52

memset(p, 0, sizeof(str));
0 0 0 0 0 0 0 0 0 0

memset(str, 0, sizeof(str));
0 0 0 0 0 0 0 0 0 0

memset(p, 0, 10);  //直接寫10也行, 但不專業
0 0 0 0 0 0 0 0 0 0

 

reference:大哥1大哥2、還有一個知乎大哥找不到了