memset内存填值的用法

本文深入探讨memset函数的正确使用方法与常见误区,包括数组初始化、非字符型数组赋值的问题,以及如何避免错误使用导致的数据填充问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



memset定义为


void *memset(void *s,int c, size_t n),即将s地址开始的连续n个字节(Byte)以参数c填写,然后返回指向s的指针,对初始化数组非常方便。


头文件:#include<string.h>


使用及误区:


1、数组初始化0:


将数组char a[n]初始化为0::memset(a,0,n),正确。


将数组int a[n]初始化为0:memset(a,0,n),错误。


正确用法为memset(a,0,n*sizeof(int))。


!!注意memset是按字节来填写值,故不同类型数据要计算好占用字节数。


2、数组填写其他值:


将数组char a[n]填写1::memset(a,1,n),正确。


将数组int a[n]填写1::memset(a,1,n),错误。memset(a,1,n*sizeof(int)),也错误。


memset是按字节来填值,故第一次错误是未计算对数组的大小;第二次虽然计算对数组的大小,但由于memset是按字节来填值,故数组a中每个元素都被按字节填写了1,即每个元素的值被填写为0x01010101,并非我们想要的0x00000001。


!!注意所以用memset对非字符型数组赋初值是不可取的! 可用for循环进行非字符数组赋初值。


原文:http://hi.baidu.com/jianghuzhijian/blog/item/27828cc445c21bc0d0006009.html

在C语言中,`memset`函数常用于对内存块进行初始化操作。该函数的原型为: ```c void *memset(void *s, int c, size_t n); ``` 其作用是将指针`s`所指向的内存块的前`n`个字节设置为`c`。需要注意的是,`c`是一个`int`类型的参数,但在实际操作中,它会被转换为`unsigned char`类型,即仅使用其低8位来内存块中的每一个字节。 ### 使用`memset`为整型数组赋最大 在使用`memset`为整型数组赋最大时,需要注意其局限性:由于`memset`是按字节进行充的,因此它不能直接为`int`或`double`等多字节数据类型赋任意数,只能使用特定的来达到预期效果。 #### 为`int`类型数组赋最大 对于`int`类型数组,若希望将其初始化为最大`INT_MAX`(即`0x7FFFFFFF`),可以使用`0x3f`作为。这是因为`0x3f3f3f3f`在十进制下是`1061109567`,与`INT_MAX`处于同一数量级,并且在某些情况下可以作为近似最大使用。具体代码如下: ```c #include <string.h> #include <limits.h> int arr[100]; memset(arr, 0x3f, sizeof(arr)); // 每个int元素被初始化为0x3f3f3f3f ``` 需要注意的是,这种方式并不能真正将数组元素设置为`INT_MAX`,而是一个接近最大的常量,适用于图论等算法中作为初始化的“极大”。 #### 为`double`类型数组赋最大 对于`double`类型数组,若希望将其初始化为最大`DBL_MAX`,则不能使用`memset`函数直接实现。因为`double`类型的数据结构较为复杂,无法通过简单的字节充来构造出特定的浮点数。在这种情况下,通常需要使用循环来逐个赋: ```c #include <float.h> double arr[100]; for (int i = 0; i < 100; ++i) { arr[i] = DBL_MAX; } ``` #### 为`int`类型数组赋-1 若希望将`int`类型数组初始化为全`-1`,可以使用`memset`函数并传入`-1`作为参数。由于`-1`的二进制表示为全1,因此使用`memset(a, -1, sizeof(a));`可以将数组中的每个字节都设置为`0xFF`,从而使得每个`int`元素的为`-1`。具体代码如下: ```c int arr[100]; memset(arr, -1, sizeof(arr)); // 每个int元素被初始化为-1 ``` ### 总结 虽然`memset`函数在初始化内存块时非常高效,但它仅适用于按字节操作的场景。对于多字节数据类型(如`int`和`double`),若需要赋特定的最大或最小,则需要根据具体的数据类型和需求选择合适的方法。[^1] [^2] [^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值