在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。

每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:
# include <string.h>
void *memset(void *s, int c, unsigned long n); 函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。 memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。 memset 一般使用“”初始化内存单元,而且通常是给数组或结构体进行初始化。一般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要用 memset。如果用 memset 的话反而显得麻烦。 当然,数组也可以直接进行初始化,但 memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。 这时有人会问:“字符串数组不是最好用'\0'进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为'\0'吗?” 可以的。虽然参数 c 要求是一个整数,但是整型和字符型是互通的。但是赋值为 '\0' 和 0 是等价的,因为字符 '\0' 在内存中就是 0。所以在 memset 中
初始化为 也具有结束标志符 '\0' 的作用,所以通常我们就写“”。 memset 函数的第三个参数 n 的值一般用 sizeof() 获取,这样比较专业。注意,如果是对指针变量所指向的内存单元进行清零初始化,那么一定要先对这个指针变量进行初始化,
即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof(p),这是新手经常会犯的错误。
因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof(p) 的值都是 。 下面写一个程序:
# include <stdio.h>
# include <string.h>
int main(void)
{
int i; //循环变量
char str[];
char *p = str;
memset(str, , sizeof(str)); //只能写sizeof(str), 不能写sizeof(p)
for (i=; i<; ++i)
{
printf("%d\x20", str[i]);
}
printf("\n");
return ;
}
根据memset函数的不同,输出结果也不同,分为以下几种情况:
memset(p, , sizeof(p)); //地址的大小都是4字节
- - - - - - memset(p, , sizeof(*p)); //*p表示的是一个字符变量, 只有一字节
- - - - - - - - - memset(p, , sizeof(str)); memset(str, , sizeof(str)); memset(p, , ); //直接写10也行, 但不专业

最新文章

  1. IPv6进阶
  2. C# 使用SqlBulkCopy类批量复制大数据
  3. C++二维码相关库编译
  4. cacti yum快速部署
  5. Java常见排序算法之快速排序
  6. wpf MVVM ViewModel 关闭View显示
  7. php 解决大流量网站访问量问题
  8. Android Studio 设置LogCat 颜色
  9. 基于Ceph快照的异地灾备设计
  10. 【R】正态检验与R语言
  11. sql优化基础篇
  12. 如何在 Apache 里修改 PHP 配置
  13. 在页面中有overflow-y:auto属性的div,当出现滚动条,点击返回顶部按钮,内容回这个div最顶部
  14. Android MVP 架构一 View与Presenter
  15. Keil生成汇编文件、bin文件
  16. bzoj 1060
  17. 《Redis 垃圾回收》
  18. Linux创建一个周期任务来定期删除过期的文件
  19. java.lang.IllegalStateException: Cannot forward after response has been committe
  20. JS ——DOM,BOM(包含盒模型,动画)总结

热门文章

  1. python图像特征提取
  2. 查看linux防火墙的状态
  3. element ui step组件在另一侧加时间轴显示
  4. DBCP重连的问题及解决办法(转)
  5. 【Luogu】【关卡2-16】线性动态规划(2017年10月)【还差三道题】
  6. Qt 【关于控件样式,鼠标进入、离开、点击】
  7. JavaIO流之字节流
  8. Java之数据库连接池
  9. PHP ftp_alloc() 函数
  10. 贪婪算法--Python