博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memset()函数的使用注意
阅读量:5226 次
发布时间:2019-06-14

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

最近,同事在负责一个项目的时候遇到一个问题:数组初始化后值异常,后来找出是使用memset函数的锅,这里我也来跟着学习下。。

C语言中memset源码如下:

void *memset(void *s, int c, size_t count){    char *xs = s;    while (count--)        *xs++ = c;    return s;}

我们可以发现,在memset()函数中,会将(void *)类型转换成(char *)类型,这样会有什么影响呢?

1、试验一

#include 
#include
int main(void){ int i=0,j=0; int array_1[16]; char array_2[16]; memset(array_1, 0, 16); memset(array_2, 0, 16); printf("[array_1]:"); for(i; i<16; i++) { printf("%d ",array_1[i]); } printf("\n"); printf("[array_2]:"); for(j; j<16; j++) { printf("%d ",array_2[j]); } printf("\n"); return 0;}

这里分别设置两个类型的数组,一个int型,一个char型,那么输出结果如下:

[array_1]:0 0 0 0 1835627636 1600061541 1869833334 1952802655 1 0 4196205 0 0 0 0 0

[array_2]:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

可以发现,这时候int型的数组初始化是异常的。若细心一点可以发现,int型数组的前4个成员都是为0的(16个字节),这个长度刚好是array_2的长度。那这是不是由于memset是以char为单位进行置0,所以只初始化了int型数组的前四个成员呢?

2、试验二:

memset(array_1, 0, 64);

那么输出结果如下:

[array_1]:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

[array_2]:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

可以发现,int型数组初始化完成了。那么是不是指针转换是数据丢失呢?

3、实验三:

#include 
#include
int main(void){ int *addr_1 = (int *)0x12345678; char *addr_2 = (void *)addr_1; printf("addr_1 : %p\n",addr_1); printf("addr_2 : %p\n",addr_2); return 0;}

那么输出结果如下:

addr_1 : 0x12345678

addr_2 : 0x12345678

也是就说,不同类型的指针的指针长度是一样的,但是,指针偏移的时候会根据所声明的类型来进行偏移。如同样是prt++,int *表示偏移是4个字节,char *则表示偏移是1个字节

既然这样的话,那么如果结构体里面成员类型不同的话,那么结构体的初始化也会有影响吗?

4、实验四:

#include <stdio.h>

#include <string.h>

typedef struct _s_param

{
  int a;
  int b;
  char c;
}S_PARAM;

typedef struct _s_var

{
  char a;
  char b;
  int c;
}S_VAR;

int main(void)

{
  S_PARAM param;
  S_VAR var;

  memset(&param, 0, sizeof(S_PARAM));

  memset(&var, 0, sizeof(S_VAR));

  printf("[param(%ld)] a=%d, b=%d, c=%d\n",sizeof(S_PARAM), param.a,param.b,param.c);

  printf("[var(%ld)] a=%d, b=%d, c=%d\n",sizeof(S_VAR), var.a,var.b,var.c);
}

那么输出结果如下:

[param(12)] a=0, b=0, c=0

[var(8)] a=0, b=0, c=0

可以发现结构体的初始化是正常的,这是因为输入的长度是结构体的长度,那这样的话,那前面的数组初始化用sizeof的话,应该也是初始化正常的(这里就不进行实验啦)

 

转载于:https://www.cnblogs.com/Recca/p/11221111.html

你可能感兴趣的文章
delegate事件代理
查看>>
cf1172E Nauuo and ODT(LCT)
查看>>
进程和线程的区别?优缺点
查看>>
英语 - 词法
查看>>
Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]
查看>>
hiho_1048_状态压缩2
查看>>
GPS USB驱动串口被占用
查看>>
排序方法——选择排序
查看>>
软件建模——第5章 总体设计
查看>>
hack:选择符前缀法,样式属性前缀法
查看>>
springsecurity基于数据库验证用户
查看>>
探索并发编程(七)------分布式环境中并发问题
查看>>
iOS开发之Socket编程
查看>>
SugarCRM 插件介绍
查看>>
java之struts2之拦截器
查看>>
多线程笔记
查看>>
Java 常用类 -String VS StringBuffer
查看>>
签名算法
查看>>
hdu 4512 吉哥系列故事——完美队形I(最长公共上升序列)
查看>>
MyEclipse中Ctrl+Shift+F快捷键格式化代码时不换行
查看>>