最近在项目过程中发现了几个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. ORACLE误删除表数据或误更新/插入数据如何恢复

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

  2. 【floyd+矩阵乘法】POJ 3613 Cow Relays

    Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...

  3. 学习前端的时候,突然想起了Sharepoint母版页里的占位符,算知识的融会不?

    今天看到这个段话,我就想起来当时学习Sharepoint的时候,总是搞不明白我们老师讲的那个母版页里的占位符到底是干啥的.现在看到了类似的东西,让我想起来了之前一直搞不懂的东西,很感慨. (完)

  4. 部署Redis Cluster 6.0 集群并开启密码认证 和 Redis-cluster-proxy负载

    部署Redis Cluster集群并开启密码认证 如果只想简单的搭建Redis Cluster,不需要设置密码和公网访问,可以参考官方文档. 节点介绍 Cluster模式推荐最少有6个节点,本次实验搭 ...

  5. Java贪吃蛇小游戏

    贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...

  6. Milk Pumping

    今天第一次正式打个人定位赛,还是太菜,这题连枚举加最短路都没想到,显然菜是原罪. 题面: : 题解:其实方法很多,千万别浪到网络流用dinic求最大网络流求的最小费用,这题不一样.最大流/最小费用 不 ...

  7. v-model修饰符

    1).lazy:取代 input 监听 change 事件. 用法: v-model.lazy="message" 效果: 在input输入框改变数据时,v-model绑定的DOM ...

  8. redis源码学习之工作流程初探

    目录 背景 环境准备 下载redis源码 下载Visual Studio Visual Studio打开redis源码 启动过程分析 调用关系图 事件循环分析 工作模型 代码分析 动画演示 网络模块 ...

  9. 用nodejs实现向文件的固定位置插入内容

    往文件的固定的行写入数据: 需要用到时nodejs的fs模块和path模块 用到fs模块的方法 readFileSync & writeFileSync : readFileSync 是读取文 ...

  10. flask 源码专题(二):请求上下文与全文上下文

    源码解析 0. 请求入口 if __name__ == '__main__': app.run() def run(self, host=None, port=None, debug=None, lo ...