1、“想当然”导致的后果

今天犯了一个十分低级的错误,在对一个整型数组用memset进行初始化设置所有元素值为1.可是结果却大出所料,很意外啊!接着,我就做了代码测试。

#include <iostream>using namespace std;int array1[10001];
int array2[10];
int array3[10];int main()
{memset(array1, -1, 10);memset(array2, 0, 10);memset(array3, 1, 10);for (int i = 0; i < 10; i++)cout << array1[i] << ' ';cout << endl;for (int i = 0; i < 10; i++)cout << array2[i] << ' ';cout << endl;for (int i = 0; i < 10; i++)cout << array3[i] << ' ';cout << endl;return 0;
}

输出结果如下:

这是啥情况呢?

2、知其然,而不知其所以然

带着这个疑问去查了相关资料,才明白自己真的是犯了一个很low的错误啊!只知道,memset函数可以对数据进行初始化,但是不知其中的原理。这也是学习中的大忌啊!

下面给出对memset的解释及应用。

函数原型:extern void* memset(void *buffer,int c,int count),buffer是指针或者数组名,c是赋给buffer的值,count是buffer的长度。

该函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer)),另外memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;

例如:char a[100];memset(a, '\0', sizeof(a));

memset可以方便的清空一个结构类型的变量或数组。

struct Student
{
char csName[16];
int iSeq;
int iType;
};

对于变量 Student stu;一般情况下清空stu的方法:

stu.csName[0]='/0'; stu.iSeq=0; stu.iType=0;

用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));

如果是数组:struct sample_struct TEST[10];则

memset(TEST,0,sizeof(struct sample_struct)*10);

扩展一下,介绍一下strcpy和memcpy。

strcpy

  原型:extern char *strcpy(char *dest,char *src);

  用法:#include

  功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

  返回指向dest的指针。

  memcpy

  原型:extern void *memcpy(void *dest, void *src, unsigned int count);

  用法:#include

  功能:由src所指内存区域复制count个字节到dest所指内存区域。

  说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

一直误解的memset函数相关推荐

  1. python sizeof函数_sizeof运算符和strlen函数 ZeroMemory函数和memset函数

    strlen和sizeof 在之前一直把两个东西在某种意义上混淆了,对它们的功能不是很熟悉. 在逛了下谷歌之后,发现自己误解的东西很多. strlen与sizeof的区别 1.sizeof操作符的结果 ...

  2. memset()函数用法及其作用

    memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...

  3. memset函数详细说明

    1.void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.例子 #include <stdio.h> ...

  4. memset函数使用详解

    1.void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.例子 #include void main(){ c ...

  5. 【转】C语言的memset函数

    http://vip.6to23.com/tenax/clib/string/memset.htmlhttp://hi.baidu.com/longchengjiang/blog/item/32c0e ...

  6. C/C++中memset()函数

    函数介绍 memset()函数的作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作. void *memset(void *s, int ch, size_t n) ...

  7. 编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性。

    编写一个自己的完全C语言版本的memset函数,并且评价这个实现的性能和可移植性. memset这个函数的作用大致可以理解为将从指针指向的地址开始的指定字节长度的空间全部替换为指定的值.那么我们可以很 ...

  8. memset函数及其用法,C语言memset函数详解

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

  9. 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数

    一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...

最新文章

  1. 一篇文章7.4万,Nature 33种期刊开放获取新政引争议,社区斥其「寄生虫」
  2. Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能
  3. (5) ebj学习:ejb用jpa操作数据库1
  4. DOM-12 【模拟桌面待讲评】鼠标事件深入、点击与拖拽分离、双击事件
  5. 【牛客 - 181D】小叶的巡查(树的直径,数学)
  6. POJ 2453 贪心应用
  7. 【Java并发】Runnable、Callable、Future、FutureTask
  8. BestCoder Round #89
  9. 资产负债表 公式总结
  10. 圆通电子面单下单接口
  11. 计算机中的信息计量单位字,计算机中信息的计量单位.pdf
  12. vivado和modelsim联合仿真,提示giving up waiting on lock,error:verilog compiler exiting解决方法
  13. 2022-09-16 蒟蒻の模拟赛之Summary
  14. 人间第一赋《破窑赋》《命运赋》《时运赋》
  15. Crossplane - 比 Terraform 更先进的云基础架构管理平台?
  16. 计算机上如何保存ico格式,PS不能另存为ico格式怎么回事_PS不能另存为ico格式如何解决...
  17. 计算机图形基础学答案,计算机图形学基础答案全.pdf
  18. 源码扫描工具Fortify SCA和FireLine对比说明
  19. 销 售 具 备 10 条
  20. 试一试 kolla部署OpenStack Ocata

热门文章

  1. 怎么创建python django项目_创建Django项目图文实例详解
  2. 目前服务器操作系统版本,目前服务器操作系统版本号
  3. arm linux远程桌面win7卡顿,主编解答win7系统使用远程桌面出现卡顿的恢复方法
  4. JAVA 定义全局常量码表_【Java基础】java常量是什么?
  5. Linux上对图片进行压缩
  6. 运行报错java.lang.Exception: No runnable methods
  7. wps中,点空格或者enter之后首字母变大写问题
  8. Spark基础学习笔记16:创建RDD
  9. 【codevs2399】【BZOJ2753】滑雪与时间胶囊,bfs+最小生成树
  10. 2017.9.4 Nim 思考记录