随笔分类 -  c

不同优化选项对ARM下C语言编译的影响
摘要:我们知道在C语言编译时,有那么几个常用的优化编译选项,分别是-O0,-O1,-O2,-O3以及-Os。之前一直觉得既然是优化选项,顶多是优化一下逻辑,提高一些效率或者减少一下程序大小而已。很少会觉得它们会影响程序的最终结果。直到最近在ARM平台上发现一个程序里的一个bug,才觉得这些优化选项有时候也没那么智能。或者说针对ARM平台,还没有那么智能。 首先看这么一段程序,此程序是我将问题简单化的程序:#include#includeint main(){ char buffer[1024] = {0,1,2,3,4,5,6,7}; int iTest = 0x12345678; int ... 阅读全文

posted @ 2013-08-12 18:35 守夜者 阅读(4058) 评论(0) 推荐(1) 编辑

阻塞机制下的recv小结
摘要:recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。 首先阻塞接收的recv有时候会返回0,这仅在socket被正常关闭时才会发生。而当拔掉设备网线的时候,recv并不会发生变化,仍然阻塞,如果在这个拔网线阶段,socket被关掉了,后果可能就是recv永久的阻塞了。所以一般对于阻塞的socket都会用setsockopt来设置socket的超时。 当超时时间到达后,recv会返回错误,也就是-1,而此时的错误码是EAGAIN或者EWOULDBLOCK,POSIX.. 阅读全文

posted @ 2012-08-16 22:05 守夜者 阅读(25164) 评论(4) 推荐(3) 编辑

实例分析用指针访问二维数组的几种方法
摘要:之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多。所以当我尝试用二级指针去访问二维数组时,就经常会出错。下面就是刚开始写的一个错误的程序:#include <stdio.h>int main(){ int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]); printf("ar... 阅读全文

posted @ 2011-09-25 12:30 守夜者 阅读(18771) 评论(6) 推荐(3) 编辑

浅析linux下c程序堆栈分布
摘要:我们知道c语言中的程序中的数据根据分布一般可以分为三种,一种是分布在数据段中的,一种是分布在栈上的,还有一种分布是堆上。全局变量往往都存放在数据段中,而函数中声明的变量一般都存放在栈上,而用malloc或者calloc分配出来的空间则是在堆上。但是我之前一直不知道这数据段、堆还有栈到底在内存上是怎样分布的,更不知道它们之间的距离是多少,也不会根据数据的指针来判断数据的类型。但是前些日子,为了跟踪一个数据莫名被修改的问题,终于对这堆栈的分布有了个形象的了解。 在《UNIX环境高级编程》中提到:对于x86处理器上的Linux,正文段从0x08048000单元开始,栈底则在0xC0000000之下. 阅读全文

posted @ 2011-09-13 21:10 守夜者 阅读(3297) 评论(2) 推荐(2) 编辑

指针类型对指针做差的影响
摘要:之前知道指针变量其实存放的就是数据在存储空间存储的地址,而地址在32位机上往往都是32位数据,感觉都是一样的,与所指向的数据的类型关系不大。所以一直觉得指针类型的唯一作用,就是提高程序可读性,防止我们滥用指针。至于指针做差的返回值应该就是地址的差值。但是最近有一次对指针进行做差的时候,无意中发现其实并没有这么简单。源代码如下:#include<stdio.h>int main(){ int *p1 = (int *)0; int *p2 = (int *)4; int result; printf("p1 = %d, p2 = %d\n... 阅读全文

posted @ 2011-03-19 20:11 守夜者 阅读(1133) 评论(6) 推荐(0) 编辑

它被定义了,但它却被定义为未定义——有趣的宏定义
摘要:前些日子为了弄清楚宏定义写了个小程序,忽然发现将标识符定义为空和将标识符定义为未定义完全是两码事……然后发现原来宏定义中还有一种状态叫“未定义”。下面就是那个小程序以及简单的分析,然后通过这个程序可以充分体验一下这个“未定义”的状态,体验一下什么叫“它被定义了,但它却被定义为未定义”。程序源码:#include<stdio.h>int main(){#if (A == B) printf("define A = B\n");#elif (A == C) printf("define A = C\n");#else printf("n 阅读全文

posted @ 2011-03-13 11:09 守夜者 阅读(2979) 评论(2) 推荐(0) 编辑

轻松掌握c语言中的sizeof
摘要:网上有很多文章已经详细讲述过sizeof的用法,但是我觉得其实sizeof并没有那么复杂。在这儿简单地再总结一下。1,是什么? sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换。虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是两码事。2,有什么用? sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位。3,怎么用? sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量的存储空间。当对变量用的时候,也可以没有括号,直接 size. 阅读全文

posted @ 2011-03-13 09:34 守夜者 阅读(4172) 评论(0) 推荐(1) 编辑

导航