在竞赛时使用 memset 发现初始化的默认值无法生效,后来发现我对 memset 的参数的理解有误。

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

将指针 ptr 所指向的内存块中前 num 个字节,用 value 替换。注意,这里面的 value 是一个字节的值。

下面谈及两个场景,初始化为 0。

memset(a,0,sizeof(a));

初始化“最大值”,之所以加上引号,是因为并不是真正的最大值。但是能够带来最大值的效果的同时,还能带来一些好处。

memset(a,0x3f,sizeof(0x3f));
  • 0x3f3f3f3f 代表的十进制数值是 1061109567 是 10^9,和 32 位的有符号整型的最大值是一个量级。而往往,数据在一般情况下都是小于 10^9 的。所以,可以达到替换最大值的效果
  • 0x3f3f3f3f + 0x3f3f3f3f = 2122219134 < INT_MAX(32位),可以避免两个最大值相加溢出的问题

如果想最大化的初始化,可以使用 0x7f,二进制位0111 1111。

memset(,0x7f,sizeof());

参考

https://www.cnblogs.com/handsomecui/p/4723949.html

Share:

2 comments

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.