【发布时间】:2014-08-04 03:41:08
【问题描述】:
manpage 说的是memset:
#include <string.h> void *memset(void *s, int c, size_t n)
memset()函数用常量字节c填充s指向的内存区域的第一个n字节。
很明显memset不能用来初始化int数组如下图:
int a[10];
memset(a, 1, sizeof(a));
这是因为int 由 4 个字节(比如说)表示,而数组a 中的整数无法获得所需的值。
但我经常看到程序员使用memset 将int 数组元素设置为0 或-1。
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
根据我的理解,使用整数 0 初始化是可以的,因为 0 可以用 1 个字节表示(在这种情况下我可能错了)。但是如何用-1(4 字节值)初始化b?
【问题讨论】:
-
投反对票,想解释一下吗?这个问题与这个网站或其他东西无关吗?
-
您对使用
0进行初始化的原因有点错误。没关系,因为0适合unsigned char(因此在用作memset的第二个参数时不会被截断)和因为sizeof(int)的内存中的位模式-字节零与内存中sizeof(int)连续一字节零的位模式相同。这两件事都必须是真实的才能起作用。事实上,在二进制补码算术中,这些情况恰好适用于两个数字:0和-1。 -
@zwol:嗯?第一句话说的是零,所以对于-1 来说不是真的。因此,大概您打算隐式参数化第一句:如果
int的值为 x 的位与sizeof(int)的位相同,则它适用于 xunsigned char每个都有值 x。此外,我们必须将具有值 x 的unsigned char视为由 x 转换为unsigned char的结果,因为 -1 是不可表示的。如果是这样,那么 0 和 -1 是唯一这样的值是不正确的。 16,843,009 • x 适用于任何整数 0 ≤ x -
@zwol:除了C不要求不同宽度的整数中的位位置表示相同的值。
-
@EricPostpischil 我不明白你的例子。任何
char类型都不能表示 16,843,009 的倍数(好吧,除非您使用的是CHAR_BIT >= 25的机器。)
标签: c++ c arrays twos-complement memset