为什么memset需要一个int而不是char?

为什么memsetint作为第二个参数而不是char ,而wmemset需要wchar_t而不是longlong long类的东西?

memset占据了很大的比例(通过相当多的)向C函数添加了函数原型。没有原型,你不能将一个char传递给一个函数 – 当你尝试的时候,它会在你传递的时候被提升为int ,而函数接收的是一个int

值得注意的是,在C中,像'a'这样的chartypes没有 chartypes – 它的types是int ,所以你传递的东西通常会int的forms出现。 从本质上来说,只有通过一个charvariables才能以字符开头并获得提升。

从理论上讲, memset可能会被修改,所以它会收到一个char而不是int ,但是不太可能有任何好处,而且破解一些旧的代码或其他的可能性相当不错。 有一个未知的,但潜在的相当高的成本,几乎没有任何真正的好处的机会,我会说它被改变接受一个char之间的“苗条”和“没有”之间的char的机会。

编辑(响应注释): intCHAR_BIT最低有效位用作写入目标的值。

可能是为什么<ctypes.h>的函数采用ints而不是chars

在大多数平台上, char太小而不能单独推入堆栈,所以通常会将字符types推到最接近机器字长的types,即int

正如@ 桂13的评论中指出的那样,这样做也会提高性能。

看到弗雷德的答案,这是出于性能的原因。

在我身边,我尝试了这个代码:

 #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 

所以如你所见,只有最后一个字节被写入。 我想这是依赖于体系结构(endianness)。