为什么memset需要一个int而不是char?
为什么memset
将int
作为第二个参数而不是char
,而wmemset
需要wchar_t
而不是long
或long long
类的东西?
memset
占据了很大的比例(通过相当多的)向C函数添加了函数原型。没有原型,你不能将一个char
传递给一个函数 – 当你尝试的时候,它会在你传递的时候被提升为int
,而函数接收的是一个int
。
值得注意的是,在C中,像'a'
这样的char
types没有 char
types – 它的types是int
,所以你传递的东西通常会以int
的forms出现。 从本质上来说,只有通过一个char
variables才能以字符开头并获得提升。
从理论上讲, memset
可能会被修改,所以它会收到一个char
而不是int
,但是不太可能有任何好处,而且破解一些旧的代码或其他的可能性相当不错。 有一个未知的,但潜在的相当高的成本,几乎没有任何真正的好处的机会,我会说它被改变接受一个char
之间的“苗条”和“没有”之间的char
的机会。
编辑(响应注释): int
的CHAR_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)。