55

为什么memset将 aint作为第二个参数而不是 a char,而wmemset将 a而不是orwchar_t之类的东西?longlong long

4

3 回答 3

58

memset早于(相当多)将函数原型添加到 C 中。没有原型,你不能将 a 传递char给函数——当/如果你尝试,它会在你传递它时被提升int,以及什么函数接收是一个int.

还值得注意的是,在 C 中(但不是在 C++ 中)像这样的字符文字没有'a'type ——它有 type ,所以你传递的内容通常会以 an 开头。本质上,它以 char 开头并获得提升的唯一方法是传递一个变量。charintintchar

从理论上讲,memset可能可以对其进行修改,使其接收 achar而不是 a int,但不太可能有任何好处,并且很有可能破坏一些旧代码或其他代码。由于成本未知但可能相当高,而且几乎没有任何真正受益的机会,我会说它被改变以char在“苗条”和“无”之间获得跌幅的机会。

编辑(响应评论): 的CHAR_BIT最低有效位int用作写入目标的值。

于 2011-05-07T07:51:53.193 回答
7

<ctypes.h>可能与takeints和 not中的功能相同的原因chars

在大多数平台上,achar太小而无法自行压入堆栈,因此通常会压入最接近机器字长的类型,即int.

正如@ Gui13评论中的链接所指出的那样,这样做也可以提高性能。

于 2011-05-07T07:50:53.090 回答
-3

请参阅弗雷德的回答,这是出于性能原因。

在我这边,我尝试了以下代码:

#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

如您所见,只有最后一个字节被写入。我想这取决于架构(字节序)。

于 2011-05-07T07:59:16.120 回答