C语言中的memset

在C/C++中,有一个memset函数,常常用来清空一段内存。

#include <string.h>
// 将s的前n个字节用c填充
void *memset(void *s, int c, size_t n);// 用法举例
int arr[100];
// 将数组内存全部置为0
memset(&arr, 0, sizeof(arr));

由于是s是void* 类型的指针,那么任何类型的内存都可以清空。但是在golang中,类型检查特别严格,并没有提供类似的函数。

Golang中一种实现

// 可以填充数组、结构体
func MemSet(s unsafe.Pointer, c byte, n uintptr) {ptr := uintptr(s)var i uintptrfor i = 0; i < n; i++ {pByte := (*byte)(unsafe.Pointer(ptr + i))*pByte = c}
}func main() {var arr [10]int32MemSet(unsafe.Pointer(&arr), 1, unsafe.Sizeof(arr))fmt.Printf("%+v\n", arr)MemSet(unsafe.Pointer(&arr), 0, unsafe.Sizeof(arr))fmt.Printf("%+v\n", arr)
}
// 输出:
[KentZhang@LOCAL-192-168-97-2]$ go run memset.go
[16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009]
[0 0 0 0 0 0 0 0 0 0]

三点说明:

  1. unsafe.Pointer 是一种通用的指针类型,可以将任何数据类型的指针转化为 unsafe.Pointer,相当于C语言中的void*指针。
  2. unsafe.Pointer不能进行计算,即指针不能加减偏移计算,所以还必须转化为uintptr类型,uintptr本质上是一个整数,于是就可以计算了。
  3. uintptr是整数,不是指针,无法进行取值赋值运算,还要转化为unsafe.Pointer,再转为对应类型的指针。

实现golang中memset函数相关推荐

  1. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

  2. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  3. 浅谈C++中memset函数的用法

    浅谈C++中memset函数的用法 memset函数的头文件是cstring, 实际上是一个字符串处理函数,但常用于给静态数组(不是new出来的数组)赋特定初值. #include<cstrin ...

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

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

  5. C++中memset函数详解

    memset函数定义于<string.h>头文件中. 函数原型: void *memset(void *s,int c,unsigned long n); 函数功能:为指针变量s所指的前n ...

  6. C语言C++中memset()函数使用和注意事项

    memset()函数原型 void * memset (void * ptr, int value, size_t num); memset()功能和参数 用value填充ptr指针指向的内存块开始的 ...

  7. C++中memset函数用法

    头文件说明: C中为<memory.h> 或 <string.h> C++中为<cstring> 功能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定 ...

  8. golang中container/list包中的坑

    转载地址:golang中container/list包中的坑 - Go语言中文网 - Golang中文社区 golang中list包用法可以参看golang中container/list包用法_che ...

  9. golang的闭包函数理解

    golang中在函数中不能声明一个函数,但是可以在函数中声明匿名函数,统称闭包. 最开始接触golang时,对这一块不是特别理解,通过以下代码进行了解: 函数返回是个func()函数,返回的就是闭包函 ...

最新文章

  1. 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )
  2. 153是一个非常特殊的数,它等于它的每位数字的立方和
  3. dealloc 的水,很深?
  4. spring中配置数据源
  5. 【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 异常处理
  6. tensorflow sigmoid 如何计算训练数据的正确率_初探 TensorFlow.js
  7. LaTeX 注释一行的某一部分
  8. 一键解决Win10 LTSC 2021官方镜像存在的问题
  9. mac php fpm 502,nginx+php-fpm出现502(Bad Gateway)错误的分析与解决 | linux系统运维
  10. 面试官问你“有什么问题问我吗?”,你该如何回答? 1
  11. linux接口vlan tag,linux c vlan tag 技术详解
  12. 【面试笔试-c/c++】人民搜索2012校园招聘试题
  13. Batch Normalization论文翻译——中英文对照
  14. 如何解决WORD安全模式错误问题
  15. 对于操作系统32位amp;64位寻址地址的理解
  16. 【算法笔记】二叉树之基础遍历
  17. 凤凰新闻岳建雄:互联网已经成为传统行业
  18. markdown如何调整行距_反Markdown试验:用Markdown的思维来使用Word
  19. 防火墙用户管理和入侵防御简介
  20. fs.mkdir创建目录报错

热门文章

  1. 程序员修炼之道—摘录
  2. 普通ARP和免费ARP
  3. 计算机基础 华师网络作业答案,17春华师《网络技术基础》在线作业
  4. python快速启动一个web服务
  5. Materialize——扁平化卡片式网页模板
  6. jsp+ssm计算机毕业设计干果在线销售系统设计【附源码】
  7. 带您一键了解什么是海量存储、企业云盘
  8. 单例模式实现居民身份证
  9. 查看计算机的硬盘的命令,如何用CMD命令检查电脑的硬盘
  10. Spring xml配置式的拦截器