为什么memset
将 aint
作为第二个参数而不是 a char
,而wmemset
将 a而不是orwchar_t
之类的东西?long
long long
3 回答
memset
早于(相当多)将函数原型添加到 C 中。没有原型,你不能将 a 传递char
给函数——当/如果你尝试,它会在你传递它时被提升int
,以及什么函数接收是一个int
.
还值得注意的是,在 C 中(但不是在 C++ 中)像这样的字符文字没有'a'
type ——它有 type ,所以你传递的内容通常会以 an 开头。本质上,它以 char 开头并获得提升的唯一方法是传递一个变量。char
int
int
char
从理论上讲,memset
可能可以对其进行修改,使其接收 achar
而不是 a int
,但不太可能有任何好处,并且很有可能破坏一些旧代码或其他代码。由于成本未知但可能相当高,而且几乎没有任何真正受益的机会,我会说它被改变以char
在“苗条”和“无”之间获得跌幅的机会。
编辑(响应评论): 的CHAR_BIT
最低有效位int
用作写入目标的值。
<ctypes.h>
可能与takeints
和 not中的功能相同的原因chars
。
在大多数平台上,achar
太小而无法自行压入堆栈,因此通常会压入最接近机器字长的类型,即int
.
正如@ Gui13评论中的链接所指出的那样,这样做也可以提高性能。
请参阅弗雷德的回答,这是出于性能原因。
在我这边,我尝试了以下代码:
#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
如您所见,只有最后一个字节被写入。我想这取决于架构(字节序)。