博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么memset的第二个参数不把int替换成char
阅读量:7050 次
发布时间:2019-06-28

本文共 977 字,大约阅读时间需要 3 分钟。

 

memset是一个经常被用来初始化数组的函数,其定义如下:

1
void
*
memset
(
void
* ptr,
int
value,
size_t
num );

它的效果大致是把以ptr为起始地址,长度为num个字节的内存区间内,每个字节的值都设值成value。

这里就有一个奇怪的现象了,为什么value的类型被声明成了int,但却只用到了最低位的那个字节?或者说为什么memset只需要一个字节的值来做填充,但却需要用户传入一个int?

这还要从C89标准说起,据说在C89标准出来之前,C的代码中并不强制函数原型的声明,如果一个函数的调用出现在了它的声明之前,编译器会去假设一个声明。比如说:

1
2
3
4
5
6
7
void
bar() {
  
int
a = foo(5);
}
 
int
foo(
int
x) {
  
return
x + 1;
}

在这段代码中,foo在bar中被调用,但是声明却在其之后,现在的编译器是会给出编译错误的,但是在C89之前,编译器会根据函数调用的语句,int a = foo(5)来猜出foo的函数原型,比如传入的值是5,就是一个int,返回值也是一个int。

所以说,在一些古老的代码中,memset的调用可以发生在它被声明之前。但在C89之后,函数声明变成了必须的,于是memset就一定要被先声明出来,这时候为了照顾已有的代码,如

1
void
*
memset
( array, 0,
sizeof
(array) );

即使是对char数组赋值的memset,如

1
void
*
memset
( array,
'a'
,
sizeof
(array) );

字符常量(如’a')在C语言中也被认为成int类型,于是memset的原型就只能也使用int了……

就是说,它在接受‘a’类型的字符时,实际上的类型是int

 

 

reference:

http://stackoverflow.com/questions/5919735/why-does-memset-take-an-int-instead-of-a-char

https://leonax.net/p/3037/why-memset-takes-int-as-its-second-parameter-instead-of-char/

转载地址:http://xppol.baihongyu.com/

你可能感兴趣的文章
《Python Cookbook(第3版)中文版》——1.10 从序列中移除重复项且保持元素间顺序不变...
查看>>
深入实践Spring Boot3.2.1 新建控制器
查看>>
《C++游戏编程入门(第4版)》——2.6 使用while循环
查看>>
《Linux C编程从入门到精通》一第2章 在Linux中编写C语言代码2.1 Linux中C语言程序开发流程和工具介绍...
查看>>
《Ceph源码分析》——第3章,第2节Simple实现
查看>>
摊上事了! Facebook向用户手机发生日信息涉嫌违法
查看>>
《HTML5 Canvas开发详解》——2.4 使用路径创建线段
查看>>
《Ansible权威指南》一2.2 Ansible配置文件解析
查看>>
linux常用命令 — 操作目录
查看>>
vue axios+springboot 文件下载
查看>>
JS的继承方式
查看>>
掘金广告产品介绍
查看>>
九宫格
查看>>
手把手教你写一个 VSCode 插件
查看>>
cookie和session
查看>>
使用 multipart/x-mixed-replace 实现 http 实时视频流
查看>>
史上最牛内推小组(持续更新)
查看>>
现实中的路由规则,可能比你想象中复杂的多
查看>>
nginx配置gzip中的坑
查看>>
Javascript中的函数声明与函数表达式
查看>>