几个链接:http://blog.csdn.net/lyj2014211626/article/details/65481630
http://blog.csdn.net/lyj2014211626/article/details/65481630
http://blog.csdn.net/my_business/article/details/40537653
以前写的代码都用到了memset,今天才知道memset的正确用法
memset()函数原型是extern void *memset(void *buffer, int c, int count)
memset的正规使用时用来初始化char类型的数组,也就是说它只接受0x00到0xFF的值,也就是c的范围
c的范围必须是ASCLL码值
初学者都会有一种疑惑,为什么有了memset这个函数为什么还需要for循环对int数组进行赋值呢,但其实这个函数的作用是将数组以单个字节拷贝的方式放到指定的内存中去
举个例子
这样你可能以为如果你赋值1的话会让整个dp数组里的每一个int变成1,其实不然。
- char data[10];
- memset(data, 1, sizeof(data)); // right
- memset(data, 0, sizeof(data)); // right
- int data[10];
- memset(data, 0, sizeof(data)); // right
- memset(data, -1, sizeof(data)); // right
- memset(data, 1, sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1
- memset(dp,1,sizeof(dp));
以上代码执行后,dp数组的内容为 00000001 00000001 00000001 00000001 转化为十进制后不为1
我们在很多程序中都会看到memset(a,127,sizeof(a));这样的代码,127是什么特别的数字呢?通过基础的进制转换可以得知127的二进制表示是01111111,那么在dp数组里放的内容就是“01111111 01111111 01111111 01111111”,(10进制的2139062143),这样就实现了将数组里的全部元素初始化为一个很大的数的目的了,在最短路径问题以及其他很多算法中都是需要用到的。值得注意的是,int类型的范围为2^31-1,大约是2147483647的样子(如果我没有记错的话),所以初始化int类型的数组也可以使用127这个数值。
如果是128呢?因为128的二进制是10000000,那么放的内容就是10000000 10000000 10000000 10000000,经过计算可得这个数是-2139062144。这样就可以将数组初始化为一个很小的数了。