[原]一个由memset引发的知识点

[原]一个由memset引发的知识点

在调试一个基数排序的问题时,我想对最开始分配的int*赋初值,类似于Windows上的ZeroMemory,但是我发现事情没有那么简单。
 
例子:
#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
   int* c = new int[10];
   memset(c, 0x0, 10);
 
   for(int i = 0; i < 10; i++)
       cout << c[i] <<" -> ";
   cout << "\n";
 
   return 0;
}
Output:
0 -> 0 -> 1193541632 -> 1397052160 -> 1313818963 -> 1162690894 -> 1852785469 -> 1701605235 -> 1937330944 -> 1148020084 ->
 
1.
memset(c, 0x0, 10); => memset(c, 0x0, 10 * sizeof(int));
Output:
0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 -> 0 ->
 
2.
memset(c, 0x0, 10); => memset(c, 0x1, 10);
Output:
16843009 -> 16843009 -> 1193541889 -> 1397052160 -> 1313818963 -> 1162690894 -> 1852785469 -> 1701605235 -> 1937330944 -> 1148020084 ->
 
 
3.
memset(c, 0x0, 10); => memset(c, 0x1, 10 * sizeof(int));;
Output:
16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 -> 16843009 ->
 
 
memset prototype:
_CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t);
 
memset(a,1,20);
就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。
 
另一篇文章讲的也比较好:
 
memset的正规用法是只能用来初始化char类型的数组的,也就是说,它只接受0x00-0xFF的赋值
然而,在大多数情况下,需要对一个double或int的数组赋一个相对很大或很小的初值
 
以下的赋值方式是不正确的:
 
memset(arr,2147483647,sizeof(arr));
 
但是可以用一些技巧,来得到一个差不多的最大值,比如像:
 
memset(arr,0x7F,sizeof(arr));
 
它将arr中的值全部赋为2139062143
(注:这里的意思是,会对int的arr[0]赋值为0x7f7f7f7f = 2139062143,大家不妨可试试)
这是用memset对int赋值所能达到的最大值
 
类似的还有:
 
memset(arr,0x80,sizeof(arr)); //set int to -2139062144
memset(arr,0x7F,sizeof(arr)); //set double to 1.38242e+306
memset(arr,0xFE,sizeof(arr)); //set double to -5.31401e+303
原文地址:https://www.cnblogs.com/SunWentao/p/1759061.html