C编程之memset函数使用

原创 2018年04月15日 20:12:40

C编程之memset函数使用



概述


在编程过程中,经常会有这样的需求:将一块空间的值赋值为某个指定的值。比如在前几篇文章中,counting-sort排序,需要将计数数组的的初始值赋为0,当然最简单的方法使用循环赋值即可。出于程序笑效率的角度看,这不是最高效的解决方案,使用memset更加高效,但是使用后发现,memset存在陷阱,本文来讲讲究竟陷阱是什么,为什么产生这种陷阱,怎么避免?

memset使用


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

这是官当给出的关于memset的解释,其中ptr指针指向需要设置的空间块的地址,value表示被设置的值,num表示设置的单元数。看下面一段代码:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{

    int arr[] = {13,19,9,5,12,8,7,4,11,2,6,21};   //success
    int length = sizeof(arr)/sizeof(arr[0]);
    cout << length << endl;
    for(int i = 0; i < length;i++){
        cout << arr[i] << " ";
    }
    cout << endl;
    //memset(arr,0,length*sizeof(arr[0]));   //success, the array is fill by using 0
    //memset(arr,-1,length*sizeof(arr[0]));   //success, the array is fill by using 1,only int type array is suite
    //memset(arr,0x7f,length*sizeof(arr[0]));   //success,the array is fill by using infinity for int type array
    memset(arr,1,length*sizeof(arr[0])); //error,16843009 is seted for every unit
    for(int i = 0; i < length;i++){
        cout << arr[i] << " ";
    }
    return 0;
}

我们看到,当我们想给数组的每个单元设置值为1时,实际被填充的值确是16843009,why?在官方的解释中,有这样一段话:
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char). 这句话的含义是:将由ptr指向的内存块的第一个num字节设置为指定的值(解释为无符号字符)。这怎么解释呢?对于我们将要设置的值来讲,1代表00000001,8位表示。但是int类型通常有32位,也就是00000001000000010000000100000001,这个值被解释为16843009,这也就不足为奇了。实际上虽然memset函数的第二个参数是int,但是实际上,程序在解释时会按照char来解析。这也就提醒我们,当数组的的每个单元不是char类型时,数组不能使用memset函数初始化为我们指定的值,0除外

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jpzhu16/article/details/79952589

C语言之memset函数的使用

转自:老生常谈,正确使用memset 本文归纳了下使用memset几个需要注意的地方,虽然内容很简单,但也希望对大家有所帮助。 1. memset是以字节为单位,初始化内存块。 当初始化一个...
  • wxm349810930
  • wxm349810930
  • 2016-08-28 22:10:44
  • 1723

C语言中memset函数详解(很清晰易懂)

功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,   块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作   用 法: void *me...
  • PengPengBlog
  • PengPengBlog
  • 2016-09-20 10:23:35
  • 12513

MT4编程之函数大全。

  • 2011年08月24日 12:09
  • 39KB
  • 下载

memset函数与二维数组初始化的问题

今天在编写Levenshtein distance距离函数时用到二维数组,用memset对其初始化时发生了问题,直接代码: int** m = NULL; int i = 0,j = 0; ...
  • lvhaitao
  • lvhaitao
  • 2016-03-10 19:27:29
  • 5363

C/C++ 之 fill ()的运用及与memset()的区别

fill()函数参数:fill(first,last,val);  // first 为容器的首迭代器,last为容器的末迭代器,last为将要替换的值。 如:要将数组a中的前100项的值赋值为1;...
  • xia842655187
  • xia842655187
  • 2015-10-19 20:01:55
  • 1644

memcpy/memset函数的c语言实现

1、memcpy 头文件:#include 函数原型:void *memcpy(void *dest, const void *src, size_t n) 功能:将指针src指向的内存空间的...
  • u011118276
  • u011118276
  • 2015-07-03 18:22:27
  • 3452

C语言memset函数详解与误用

memset为内存填充函数,包含在头文件中,可以用它对一片内存空间进行初始化,其原型为   void *memset(void *s, int v, size_t n);   英文释义如下:  ...
  • hu_jiacheng
  • hu_jiacheng
  • 2013-05-18 19:11:34
  • 11471

c函数之memcpy ,memset,malloc函数使用

常见的函数使用小结
  • Ctrl_qun
  • Ctrl_qun
  • 2017-01-18 12:00:37
  • 1447

Linux系统库函数之strsep

/* lib/string.c */ strsep函数用于分割字符串,函数原型如下: char *strsep(char **s, const char *ct); s为指向欲分割的字符串,...
  • mcgrady_tracy
  • mcgrady_tracy
  • 2012-11-02 23:57:46
  • 5285

透彻分析C/C++中memset函数

透彻分析C/C++中memset函数     在C语言中,经常需要对内存进行操作,里面涉及很多函数,但是memset函数的使用有一点需要大家格外注意,这也是我在做项目时遇到过的一个问题,调试了很久...
  • dan15188387481
  • dan15188387481
  • 2015-11-03 21:33:10
  • 13276
收藏助手
不良信息举报
您举报文章:C编程之memset函数使用
举报原因:
原因补充:

(最多只允许输入30个字)