最近在项目过程中发现了几个c语言中没有注意到的小细节,成功入坑。下面记录的我遇到的问题,以及解决的方法,希望这个过程能给读者带来些许启发。

字符类型变量的溢出

首先来看下面这段代码,你认为会输出什么呢?

int remain = 129
do{
char d = remain%128;
remain /= 128;
if(remain > 0)
d |= 0X80;
*s++ = d;
}while(remain > 0);
printf("str:%x\r\n",*str);

你也许会和我的想法相同,这返回不是81么?要是一眼就被看出来我也就不会记录下来了,往往我们定义数据类型时都忽略了2个问题,数据类型的取值范围与加unsigned与不加的区别,下面就通过这个例子来聊聊这两点。

先揭晓答案,这段伪代码的返回FFFFFF81,为什么呢? 因为char类型占1个字节的大小,其取值范围为-128~127,1+(-128)=-127,而在计算机中,负数是由补码表示,也就是我们看到FFFFFF81,在计算机中表示-127,而81,在计算机中表示正数129,也许还有个疑问,char类型占1字节大小,而FFFFFF81占了4字节大小,这不是空间溢出了么? 其实并没有,当变量是负数时,在计算机中由32位表示,但其所占的空间内存还是一字节

如果*s的数据类型是unsigned char结果又是什么呢? 没错,这回就真是81了,因为unsigned char的取值范围为0~255。是不是若有所思呢?下面来检验下收获吧,请看下面代码

short int a=1234;
short int *p=&a;
char *q=(char *)p;
char *k=(char *)p+1;
printf("address:%p--%p--%p\n",p,q,k);
printf("value:%x--%x--%x\n",*p,*q,*k);

实验写出上面代码的输出结果吧!

二维数组赋值

二维数组赋值,你知道几种方法呢,用for循环逐个完成、初始化时完成,使用下面的赋值方式你觉得怎么样呢?

char a[100][128];
char *topic = "matt test"; a[0] = topic; printf("a[0]:%s\r\n",a[0])

上面伪代码是个错误的例子,因为数组首地址不可被改变这条规则,所以编译器不会通过这段代码。如果用数组首地址对数组赋值,有什么方便的方法呢? 见下面代码

char a[100][128];
char *topic = "matt test"; memset(a,0x0,sizeof(a));
memcpy(a[0],topic,strlen(topic)); printf("a[0]:%s\r\n",a[0])

指针地址变化

C语言中,指针是一大精华,也是一个难点,使用不当容易造成内存泄漏,使系统不稳定。若对已初始化但未分配内存空间的指针写值,易造成segmentation fault(段错误)。下面指针的地址你清楚么?

short int a=1234;
short int *p=&a;
char *q=(char *)p;
printf("address:%p--%p--%p--%p\n",p,p+1,q,q+1);

指针地址的变化与指针的的数据类型相关,而在不同操作系统中,数据类型也有所不同,在64位Windows与linux系统中,char与int分别占1字节与4字节内存空间,故(P+1)-p为4,(q+1)-q为1.

清风 | 文 【原创】

如果本篇博客有任何错误,请批评指教,不胜感激 !

C踩坑纪实——(一)的更多相关文章

  1. 在mac下初次使用pygame踩坑纪实(卡死)

    初次使用pygame实现绘图功能就踩坑 直接上代码 import pygame pygame.init() # 创建游戏的窗口 480 * 700screen = pygame.display.set ...

  2. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  3. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  4. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

  5. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  6. 我的微信小程序入门踩坑之旅

    前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...

  7. router路由去掉#!的踩坑记

    项目中在研究去掉router#!的过程中的踩坑过程.

  8. vue+ vue-router + webpack 踩坑之旅

    说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少 ...

  9. 记jQuery.fn.show的一次踩坑和问题排查

    最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...

随机推荐

  1. Tensorflow入门学习笔记汇总

    一.环境准备 1.安装python:下载地址https://www.python.org/downloads/windows/下载并安装(推荐python3) 2.安装对应python版本的库:htt ...

  2. layui动态添加的元素click等事件触发不了的解决办法

    在页面加载完成时候 '.add_project' 元素是可以触发click时间的,当动态添加 '.add_project' 时候,新添加的元素却触发不了click事件,类似下面的写法: $(" ...

  3. Tensorflow与Keras自适应使用显存

    Tensorflow支持基于cuda内核与cudnn的GPU加速,Keras出现较晚,为Tensorflow的高层框架,由于Keras使用的方便性与很好的延展性,之后更是作为Tensorflow的官方 ...

  4. ORACLE误删除表数据或误更新/插入数据如何恢复

    工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料   PL/SQL 方法/步骤     首先新建一张测试表TEST,里面输入记录.由于删除/更 ...

  5. 策略模式、策略模式与Spring的碰撞

    策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式. 实际案例 我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况: 如果A地-B地往返都 ...

  6. 利用 React 高阶组件实现一个面包屑导航

    什么是 React 高阶组件 React 高阶组件就是以高阶函数的方式包裹需要修饰的 React 组件,并返回处理完成后的 React 组件.React 高阶组件在 React 生态中使用的非常频繁, ...

  7. JVM类加载机制小结

    这篇文章我们关注一个问题:Java程序是怎么进入JVM并执行的?经常写Java程序的小伙伴应该都听说过类加载机制,在<深入理解Java虚拟机>里周老师已经讲的很清楚了,这篇随笔把之前的笔记 ...

  8. request.headers.get头部获取内容的缺失

    1.说明 今天遇到了一个小坑,在做权限控制的时候,用头部传递了参数取名为table_privilege_id, 在本地测试的时候是可以接到这个参数的,但是通过ngxin转发之后,奇怪了,怎么也拿不到这 ...

  9. Fetch.ai的突破使急速闪电共识成为现实

    Jonathan Ward 区块链的终结问题是由于技术限制,它已经成为区块链技术被广泛采用的障碍.用外行的话来说,终结时间可以看作是事务首次提交到网络并被确认为有效之间的等待时间.为了成功地革新我们的 ...

  10. day52 html进阶

    目录 一.分组与嵌套 二.伪类选择器 三.伪元素选择器 四.选择器优先级 五.css属性相关 1 字体属性 2 文字属性 3 背景图片 4 边框 5 display属性 6 盒子模型 7 浮动 一.分 ...