【转】memset赋值0和-1,还能赋其他值吗?

本文详细解析了在C/C++中使用memset函数初始化不同数据类型时的行为差异,特别是针对char和int类型的数组。通过具体示例说明了memset如何逐字节地进行内存赋值,以及这种操作对于不同类型数据的意义。

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

参考如下:

https://blog.youkuaiyun.com/melody_1016/article/details/83479778

-1 的二进制表示就是  1111 1111 1111 1111

1是int型,占4个字节,二进制表示为 00000000 00000000 00000000 00000001 。

memset每次只能给1个字节的内存单元赋值,1是整型,占4个字节,所以每次只能取4个字节的最低位即"00000001"。

 

 

 

最新添加:memset 在初始化 char 型数组及数组的指针时,可以随意用,并不像int型数组那样每次分配都指定1个字节的长度。

来源:https://blog.youkuaiyun.com/my_business/article/details/40537653

以下是截图:

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

余额充值