簡體   English   中英

為什么memset采用int而不是char?

[英]Why does memset take an int instead of a char?

為什么memset接受int作為第二個參數而不是char ,而wmemset接受wchar_t而不是longlong long呢?

memset早於(在很大程度上)向C語言添加了函數原型。沒有原型, 就無法char傳遞給函數-如果/如果嘗試,將在傳遞給char時將其提升為int ,函數接收的是一個int

另外值得一提的是,C,(但不是在C ++)字面像一個字符'a' 沒有類型char -它的類型是int ,所以你通過什么通常會開始作為一個int反正。 本質上,將其作為char開始並得到提升的唯一方法是傳遞char變量。

從理論上講, memset可能會被修改,以便它接收一個char而不是一個int ,但是幾乎沒有任何好處,並且破壞了一些舊代碼或其他代碼的可能性相當大。 我想說,雖然成本未知,但可能相當高,幾乎沒有任何實際收益的機會,所以改變它以接收char的機會char介於“苗條”和“無”之間。

編輯(響應注釋): intCHAR_BIT最低有效位用作寫入目標的值。

<ctypes.h>的函數采用 ints而不是 chars可能原因相同。

在大多數平台上, char太小而無法單獨推入堆棧,因此通常推入最接近機器字長的類型,即int

正如@ Gui13的注釋中的鏈接所指出的那樣,這樣做還可以提高性能。

請參閱fred的答案,這是出於性能方面的考慮。

在我這邊,我嘗試了以下代碼:

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[])
{
    char c = 0x00;

    printf("Before: c = 0x%02x\n", c);
    memset( &c, 0xABCDEF54, 1);
    printf("After:  c = 0x%02x\n", c);

    return 0;
}

它在64位Mac上為我提供了這一點:

Before: c = 0x00
After:  c = 0x54

如您所見,只有最后一個字節被寫入。 我猜這取決於體系結構(字節序)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM