C编程之memset函数使用

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除外

猜你喜欢

转载自blog.csdn.net/jpzhu16/article/details/79952589