最近在项目过程中发现了几个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. vue全家桶(1)

    1.环境搭建 1.1.脚手架搭建 1.1.1什么是脚手架 百度搜索一下脚手架长什么样子,它们是这样的: 从百度百科抄过来一段话: 脚手架是为了保证各施工过程顺利进行而搭设的工作平台.如果明白了脚手架在 ...

  2. win10提示“无法设置移动热点 请打开WLAN”的解决方法

    一位用户在使用Win10创意者操作系统过程中,遇到了无法开启移动热点的情况,开关呈灰色状态,而且提示:无法设置移动热点 请打开WLAN,该如何解决呢?该用户表示Wlan一直开着呀,感觉非常奇怪.接下来 ...

  3. em(倍)与px的区别

    在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...

  4. Mac安装文件已勾选“允许任何来源”,还是提示“文件已损坏”的解决方案

    Mac安装文件已勾选"允许任何来源",还是提示"文件已损坏"的解决方案 打开终端,在终端中粘贴下面命令:[sudo xattr -r -d com.apple. ...

  5. matlab添加toolbox失败的解决办法

    matlab添加toolbox有三种方法: 1.在网上下载对应的文件,再复制到matlab安装路径中的toolbox文件夹里. 结果:失败.仍然显示不能用该模块. 2.由于笔者的学校有买正版,所以可以 ...

  6. css实现左边定宽右边自适应的5种方法总汇

    在网页布局中,通常需要实现左边定宽右边自适应布局,默认html的结构如下: <div class="box"> <div class="left&quo ...

  7. Jetbranis学习资料之全家桶

    相信很多小伙伴,用的代码编辑器很多都是Jetbrains的,但好东西不可能免费的,而且找了很多激活码都是失效总是莫名其妙的就过期了.下面分享一个不错的激活码地址,比其他的应该更加可靠.本人实测目前支持 ...

  8. MySQL数据库06 /数据库总结

    MySQL数据库06 /数据库总结 目录 MySQL数据库06 /数据库总结 1. 数据库/DBMS 2. 数据库分类 3. 修改密码 4. 库操作 5. 表操作 6. 存储引擎 7. 事务 8. 约 ...

  9. 07-Python面对对象初级

    一.简介 面对过程编程: 根据操作数据的函数或语句块来设计程序. 面对对象编程:把一些函数,数据,方法和功能结合起来,用“对象”包裹组织程序的一种方法. 类和对象是面向对象编程的两个主要方面.类创建一 ...

  10. 03-Python控制语句

    一.简介 通过一些语句来改变程序的执行顺序,这些语句被叫做控制语句,在python主要有if.for.while三种控制流语句. 二.if语句 用来检测一个条件是否成立,如果为真,则执行该语句(一般为 ...