在一个整数数组上使用 memset
不可行吗?我尝试了下面的 memset
调用,但在 int
数组中没有得到正确的整数值。
int arr[5];
memset (arr, -1, sizeof(arr)/sizeof(int));
我得到的值是:
arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0
在一个整数数组上使用 memset
不可行吗?我尝试了下面的 memset
调用,但在 int
数组中没有得到正确的整数值。
int arr[5];
memset (arr, -1, sizeof(arr)/sizeof(int));
我得到的值是:
arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0
只需更改为memset (arr,-1,sizeof(arr));
注意,对于除0和-1以外的其他值,这种方法将不起作用,因为memset函数是设置从由*ptr
变量指示的存储块开始的num
字节的字节值。
void * memset ( void * ptr, int value, size_t num );
由于int
在多个字节上表示,因此您将无法获得数组中整数的期望值。
例外情况:
您之所以得到这个结果的原因是:
arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0
因为在你的情况下,int类型长度为4个字节(32位表示),而数组的长度以字节计算为20(即5*4),而你只设置了5个字节为-1(=255),而不是全部20个字节。
memset
初始化一个int
可能也会触发陷阱表示。 - Sander De Dyckerarr
没有用static
或 extern
修饰并且显然是在一个函数内部声明(可能是 main()
),它的元素值按照定义来说是不确定的。即使是对于arr[1]
,你也不能确定下三个字节里剩余位的值是什么。因此,打印a[1]
到a[4]
的元素是明显的未定义行为。只有在 a[0]
处你才能知道确切的结果。 - RobertS supports Monica Cellio不要使用memset
来初始化除单字节数据类型之外的任何其他数据类型。
乍一看,它似乎适用于将int
初始化为0
或-1
(在许多系统上,这确实会起作用),但是你没有考虑到可能会生成捕获表示形式从而导致未定义行为,以及整数表示形式不一定是二进制补码。
将数组中的int
初始化为-1
的正确方法是循环遍历数组,并显式地设置每个值。
int
数组在所有情况下都是可靠的,而使用memset
可能无法正确地完成初始化(或者更糟的是,可能会看起来工作正常)。如果你对代码运行的平台有深入的了解,并知道它不会引起问题,那么你可以使用memset
。但我并不知道每个可能阅读这篇回答的人的平台信息,所以我更喜欢采取安全措施。我希望这样能够平衡我在回答中使用的一些"极端"观点。 - Sander De Dyckergcc提供了一种很好的数组初始化快捷方式
int arr[32] = {[0 ... 10] = 3, [11 ... 31] = 4}
注意在...
之前和之后的空格
memset(arr, -1, sizeof(arr));
sizeof(arr)/sizeof(int)
,给出了数组中元素的数量。memset()
设置的是所寻址位置的_字节_的值,而不是"项数"。 您需要将5个整数的字节设置为-1
。 这样做恰好会以格式巧合的方式将整数值设置为-1
。 - Jeff Mercado您可以通过直接初始化数组来节省一些输入:
int arr[5] = {-1, -1, -1, -1, -1};
int arr[] = {-1, -1, -1, -1, -1};
。 - RobertS supports Monica Celliovoid * memset ( void * ptr, int value, size_t num );
memset (arr, -1, sizeof(arr));