linux中memset的正确用法
2015-10-14 21:35
701 查看
1. 定义
#include<string.h> //The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c. //即对各种类型的数组进行初始化,避免野值,注意是按字节填充 void *memset(void *s, int c, size_t n);
2. 示例
//正确 char arr[10]; memset(arr,'a',10); // 由于char只占一个字节(byte),因此函数的结果是将连续的10个字节都填充为'a'。 //错误 int arr[10]; memset(arr,1,10);
原因:
(1)int占4个字节(byte),因此”1”对应的二进制(32bits下)为”00000000 00000000 00000000 00000001”(4bytes),塞到1byte(8bit)的中,高位被舍弃了。这样,填入数组中的值是”00000001”。
然而总共有10 * 4 = 40byte,却只有10个byte被填充,因此结果是”00000001……00000001**********”(前面总共10个”00000001”)。
因此,第一个数是”0x01010101”=16843009(10进制),数组其余部分的值则是随机值,读取出来会是很离谱的数!
(2)如果采用 memset(arr,1,sizeof(arr));
就是将数组的所有值都填充为”0x01010101”,也就是int数组的初始值变为了16843009 !
参考来源:
http://www.blog.csdn.net/whuslei (已失效)
http://www.cublog.cn/u1/49221/showart_422256.html
相关文章推荐
- 关于栈、堆、静态变量区的访问效率
- 关于指针定义的一些问题
- MinGW环境变量设置、CodeBlock添加额外的库
- websocket C/C++服务器应用
- #define do{}while(0)妙用
- 浅析pragma once与include guard
- Ubuntu14.04 学习二: C/C++环境搭建,执行第一个hello world
- 我所理解的makefile文件
- 对于VS中一些较严谨的(_s)函数如strcpy_s的第二个参数的问题
- 经典DP HDU 2084 数塔
- htonl,htons,ntohl,ntohs的详解
- Linux下VIM C/C++ IDE配置
- 多进程情况下文件句柄共享的问题
- C/C++ 与函数有关的typedef用法
- 代码注释
- 你会解吗? ?+?+?=30 把下面数字填到框里 (1,3,5,7,9,11,13,15)
- C/C++学习笔记(二)
- C/C++面试题(一)
- 通过本地DNS域名服务器寻找域名对应IP地址C/C++
- 环形链表插值