关于memset赋最值

博客提及关于memset赋最值的内容,出处为‘辗转山河弋流歌 by 空冰魂魂’,博客链接为blog.youkuaiyun.com/vmurder/article/details/46537613 。

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

出处[辗转山河弋流歌 by 空灰冰魂]

blog.youkuaiyun.com/vmurder/article/details/46537613

memset(a, 0x3f, sizeof(a)) //int, 到1e9左右,相加不会溢出

memset(a,0xc0,sizeof(a)); //int -1e9 同上 

memset(a,0x43,sizeof(a)); //double保证精度最大值 

memset(a,0xfe,sizeof(a)); //double保证精度最小值 
 

 

在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、付费专栏及课程。

余额充值