今天做了一道素数打表的题我在使用一个数组记录是否为素数的时候使用了memset,将数组里面的数都清为1,代表是素数,不是素数,就改成0,我在判断这一个数是否为素数是依据也是是0还是1,结果一直存在问题,经过我一步步的调试竟然发现了一个之前从未在意过的bug,memset只能将int型数组清理成0或-1!!!

我们来验证一下:

#include <stdio.h>
#include <string.h>
int main() {
int array[];
int a;
while(~scanf("%d",&a)){
memset(array,a,sizeof(array));
printf("%d %d\n",array[],array[]);
}
return ;
}

程序功能:初始化数组元素为输入值。

输入:
-1

0

1

预期输出:
-1 -1
0 0
1 1

实际输出:
-1 -1
0 0
16843009 16843009

原因:

memset是按字节赋值的,取变量a的后8位二进制进行赋值。

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,原理是这样的。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

这是c标准库里面的memset的原码:

 void *(memset)(void *s, int c, size_t n)
{
const unsigned char uc = c;
unsigned char *su;
for (su = s; < n; ++su, --n)
*su = uc;
return (s);
}

源码说明对于数组参数是按照字符数组的形式进行赋值的。

当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,

 char data[];
memset(data, , sizeof(data)); // right
memset(data, , sizeof(data)); // right

而想要将int型数组赋值成自己想要的值,我只会自己DIY了

 int a[];
for(int i=; i<sizeof(a)/sizeof(int); i++)
{
a[i]=;
}

最新文章

  1. sonn_game网站开发01:写在最前面
  2. Android 浏览器 —— 使用 WebView 实现文件下载
  3. jq封装淘宝图片轮播插件
  4. javascript全局变量和局部变量
  5. grains
  6. js正则匹配以固定格式结尾的字符串并匹配是手机访问,则跳转
  7. OpenGL在什么样的领域才是主角?
  8. BeX5学习笔记
  9. 06-CABasicAnimation基础核心动画
  10. saltstack实战3--配置管理之grains
  11. 《A First Course in Probability》-chaper2-概率论公理
  12. mysql 调用存储过程及例子
  13. Android studio导入Eclipse项目,和一些错误的解决
  14. InjectAPC全部项目(Win32和Win64位)
  15. windows 根据端口查看进行PID 并杀掉进程
  16. 旅游类App的原型制作分享-Klook
  17. Bootstrap-3-Typeahead
  18. 2017-12-18python全栈9期第三天第一节之昨天内容回顾与作业讲解用户三次机会再试试
  19. 8.1-uC/OS-III多任务应用
  20. C++和python的变量对比

热门文章

  1. 第四模块MySQL50题作业,以及由作业引申出来的一些高端玩法
  2. 5 替换空格 JavaScript
  3. vuejs 预渲染插件 prerender-spa-plugin 生成多页面 -- SEO
  4. php 冒泡法 排序
  5. 动态的GRE OVER IPSEC的实验模拟与分析
  6. VS2013 执行Enable-Migrations,产生错误的解决办法
  7. 北京Uber优步司机奖励政策(12月2日)
  8. SDWebImage的原理 和 实现机制 --- tableView 滑动卡的问题
  9. Kafka在高并发的情况下,如何避免消息丢失和消息重复?kafka消费怎么保证数据消费一次?数据的一致性和统一性?数据的完整性?
  10. 在Win10中通过命令行打开UWP应用