
C
小_鱼
这个作者很懒,什么都没留下…
展开
-
int型数组强制转换为char*,再求strlen,涉及大小端
一道有趣的面试题——将int型数组强制转换为char*,再求strlen,涉及大小端 (转) #include #includeint main(){int a[2000];char *p = (char*)a;for( int i = 0; i a[i] = -1 - i;printf( "%d\n", strlen(p));转载 2014-06-10 22:28:27 · 3474 阅读 · 0 评论 -
十道一般人无法及格的C语言试题
1、对下述代码说法正确的是: 对下述代码说法正确的是: ( #include int main(void) { char aChar; int aInt; aInt = aChar = -120; printf("%d\n", aInt); return 0; } A、 一定输出-120 。 B、一定不能输出-120 。 C、可能输出-120。转载 2014-06-23 22:50:40 · 2148 阅读 · 1 评论 -
可变参函数
在C语言中,函数参数的传递方式有值传和址传.值传是把实参的一个专用的、临时的复制值给被调函数中相应的形参被调用函数使用、修改这个传来的复制值,不会影响实参的值.址传则是把变量(实参)的地址传给被调函数.被调函数通过这个地址找到该变量的存放位置,直接对该地址中存放的变量的内容进行存取操作.因此,在被调用函数中可以修改实参的值.这也是函数参数址传的优点.无论是值传还是址传,都要求实参的数目及类型与形参转载 2014-06-23 22:43:52 · 473 阅读 · 0 评论 -
C语言读取配置文件
/*程序功能:获取配置文件中的IP字符串 程序目的:记录下来,免得以后重写了,不如意地方以后再改*/#include #include #include #include int etc_file(char *file,char *buffer);//读取配置文件int cut_ip(char *,char **);//分割并获转载 2014-06-23 22:47:40 · 891 阅读 · 0 评论 -
C语言内部静态成员陷阱
在C语言中,我们知道当函数返回时,其栈上的内存会随着函数出栈而释放,但是我们有时需要返回一块函数内部可以处理,而函数外面仍然有效的内存。大体来说有如下几种方法:1)在函数内部通过malloc在堆上分配内存,然后把这块内存返回。但是这将带来潜在的安全隐患,如内存泄露或多次释放导致程序崩溃。2)由函数外部传入一块内存,函数内部的数据处理可以在该内存块上完成。让内存由外部程序维护,比较简转载 2014-06-23 22:44:54 · 532 阅读 · 0 评论 -
C语言小结(二)
野指针不是NULL指针,是指向不可用内存的指针。C语言中没有任何手段可以判断一个指针是否为野指针!野指针的由来:局部指针变量没有被初始化使用已经释放过后的指针指针所指向的变量在指针之前被销毁用malloc申请了内存之后,应该立即检查指针值是否为NULL,防止使用值为NULL的指针(没分配成功)free指针之后必须立即赋值为NULL原创 2013-09-28 22:09:05 · 480 阅读 · 0 评论 -
C语言小结(一)
p + n = (unsigned int)p + n*sizeof(*p);结论:当指针p指向一个同类型的数组的元素时:p+1将指向当前元素的下一个元素;p-1将指向当前元素的上一个元素。如:int a[] = {1,2,3,4} a[1] = *(a+1) = *(p+1)指针之间只支持减法运算,且必须参与运算的指针类型必须相同原创 2013-09-28 21:34:40 · 526 阅读 · 0 评论 -
回调函数
1 什么是回调软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户转载 2013-10-07 23:29:56 · 459 阅读 · 0 评论 -
浅析为什么char类型的范围是 —128~+127
在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗: -2^(n-1)~2^(n-1)-1 n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -1 即-214748364转载 2013-09-21 09:58:08 · 592 阅读 · 0 评论 -
关于C++/C中防止头文件的重复包含的解决办法
为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句转载 2013-09-20 00:25:49 · 837 阅读 · 0 评论 -
C语言创建柔性数组
typedef struct {int array[];...} SoftArray;SoftArray* create_soft_array(int size){ SoftArray* ret = NULL; if( size > 0 ) { ret = (SoftArray*)malloc(sizeof原创 2013-10-03 12:37:48 · 627 阅读 · 0 评论 -
宏定义
在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. C初学者可能对预处理器没什么概念, 这是情有可原的: 一般的C编译器都将预处理, 汇编, 编译, 连接过程集成到一起了. 编译预处理往往在后台运行. 在有的C编译器中, 这些过转载 2013-09-05 00:21:48 · 963 阅读 · 0 评论 -
编译相关
#error message //停止编译 message不需要“ ” #warning message 警告 不会停止编译 message不需要“ ” gcc -DMACRO_NAME ="***" 在gcc命令添加宏定义#line 1 “dephli Tang” //重定义行号、文件名用于自己添加的部分代码、很古老#:原创 2013-09-05 13:00:16 · 584 阅读 · 0 评论 -
C语言中 sscanf 的用法
[cpp] view plaincopyprint?函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明:ssc转载 2013-09-07 23:01:28 · 643 阅读 · 0 评论 -
自写strcpy函数
/* 目的:完成从一个字符串*src,拷贝前n个字符到另一个字符数组*dest中*/#include #include void mystrcpy(char *src , int length , char *dest){ int len = 0; while(*src != '\0' && len {原创 2014-06-23 22:51:42 · 780 阅读 · 0 评论 -
将一个整型变量转换为字符串
#include void itoc(char *str,int n);int count=0;int main(){ char str[10]; int n=1234; itoc(str,n); str[count]='\0'; printf("%s\n",str); re原创 2014-06-23 22:53:36 · 1258 阅读 · 0 评论 -
数组和指针区别
什么时候数组和指针相同(When an Array Is a Pointer )在实际应用中,他们可以互换的情形要大大多于不能互换的情形。首先再回顾一下声明和定义,(上一篇中有提到这里在深入一下)声明本身还可以进一步分为三种情况:1)外部数组的声明(external array)2)数组的定义(它是声明的一种特殊情况,它分配内存空间,并可能提供一个初值)3)转载 2014-06-10 22:22:45 · 475 阅读 · 0 评论 -
双重指针与2维数组
void Func1(int *p){}void Func2(int a[]){}int main(){ int a[10]; Func1(a); int *p; Func2(p);} 即一维数组与指针作为函数参数的互换使用, 我们可以一眼看出这个程序是可以通过编译的. a是数组a[10]第一个元素的地址,转载 2014-06-10 22:22:00 · 2608 阅读 · 0 评论 -
C经典题型
1. struct node { char a[10]; int b; } p[4];A p->b=2 B p[0].a="abc" (把字符串赋给地址) C p[0]->b=2 D p->a='b'正确:p[0].b=1; 错误:p.b=1;转载 2014-06-10 22:06:16 · 441 阅读 · 0 评论 -
字符串转换成整数&带通配符的字符串匹配问题
先看题目:输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串"345",则输出整数345。请完成函数StrToInt,实现字符串转换成整数的功能,不得用库函数atoi。 我们来一步一步分析,直至写出第一份准确的代码:1、本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数。那如何实现把表示整数的字符串正确地转换成整数呢转载 2014-06-10 22:09:49 · 984 阅读 · 0 评论 -
自写的检查处理器 大小端模式
思想:将int型转化为char型#include #include int main(){int i=1;char *p=(char *)&i;int a=strlen(p);if(a==0)printf("大端模式\n");else printf("小端模式\n");}当然也可以像下一篇日志 用原创 2014-06-10 22:29:23 · 481 阅读 · 0 评论 -
数组作与指针做参数比较
C语言中的数组可分为一维数组和多维数组两类,而多维数组中又以二维数组最为常见。这里也仅针对这一维数组和二维数组作简要说明。高质量C++编程指南中指出当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针,这句话针对一维数组是正确的(目前个人认为是正确的),但是对于多维数组,这显然不完全正确。C语言之所以把数组形参当作指针是出于效率考虑,如果把一个数组全部拷贝这样势必带来性能上的损失,转载 2014-06-10 22:20:43 · 541 阅读 · 0 评论 -
C语言程序中不同的存储区域
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(code segment/text segment)通转载 2014-06-10 22:24:58 · 600 阅读 · 0 评论 -
位域
位域有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字转载 2014-06-10 22:07:16 · 381 阅读 · 0 评论 -
C语言的谜题
语言的歧义 [酷壳链接] [优快云链接]谁说C语言很简单? [酷壳链接] [优快云链接]6个变态的C语言Hello World程序 [酷壳链接] [优快云链接]如何加密/弄乱C源代码 [酷壳链接] [优快云链接]C语言的谜题 [酷壳链接] [优快云链接]1、下面的程序并不见得会输出 hello-std-out,你知道为什么吗?#include转载 2014-06-10 22:12:57 · 412 阅读 · 0 评论 -
float类型精度损失问题
float范围为: 32 3.4E–038~3.4E+038double范围为: 64 1.7E–308~1.7E+308#include #define EPSILON 0.0001 // Define your own tolerance#define FLOAT_EQ(x,v) (((v - EPSILON) int main() {转载 2014-06-10 22:27:26 · 2519 阅读 · 1 评论 -
C技巧:结构体参数转成不定参数
下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“__VA_ARGS__”,下面这段程序可以在GCC下正常编译通过:1234567891011121314151617181920#include #def转载 2014-06-10 22:16:36 · 658 阅读 · 0 评论 -
库、连接、装载
1.什么是库 在windows平台和linux 平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux 的本质不同,因此二者库的二进制是不兼容的。 本文仅限于介绍linux 下的库。 2.库的种类 linux 下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。 静态转载 2014-06-23 22:46:07 · 470 阅读 · 0 评论 -
一个字符串IP分割的处理小程序
#include #include #include unsigned int ip_list(char *str);int main(int arg,char **argv){ unsigned int ip_array[3]; int i;if(argc {print原创 2014-06-23 22:48:26 · 1873 阅读 · 0 评论 -
关于typedef int (*pFunc)(int, int)
typedef int (*pFunc)(int, int)申明一个指针变量pFunc, 指向int (*)(int, int)从而可以 pFunc func;int add(int a,int b){return (a+b);}typedef int (* func)(int ,int ) ;void main(){func f = add;原创 2013-08-15 22:32:25 · 4435 阅读 · 0 评论 -
const 修饰函数相关
看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书转载 2013-07-05 00:05:30 · 407 阅读 · 0 评论 -
C 与C++中 结构体区别
C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。C++中的结构体和类的异同:一、相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数; 也就是说在C++当中,结转载 2013-07-05 00:13:50 · 662 阅读 · 0 评论 -
函数指针 和 指针函数
使用函数指针的好处在于,可以将实现同一功能的多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。或者归纳为:便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。 可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,转载 2013-06-26 23:22:19 · 433 阅读 · 0 评论 -
给结构体内数组赋值
C语言只有在定义字符数组时才能用 ‘=’ 来初始化赋值,其他情况不能用 =如: char a[20] ="hello world";不能 char a[20];a = "hello world";但可用strcpy (a, "hello world"); //包涵结构体typedef struct _stu{char name[20];原创 2013-06-25 16:07:40 · 7827 阅读 · 0 评论 -
C类型转换问题
如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下float ------> double 高↑long↑unsigned↑int ←── char,short 低横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算原创 2013-07-10 20:58:58 · 515 阅读 · 0 评论 -
i++, ++i , i = i+1 效率问题
计算机内部实现过程有别,详细如下:i=i+1的过程相当: temp=i+1; i=temp;i++的过程相当: temp=i; i=temp+1; return temp;++i的过程最简单: i增1然后return i 的值,一步完成,没有给任何temp变量赋值:效率问题:(如果编译器优化,效率一样)x=x+1最低,因为它的执行如下。原创 2013-07-10 19:34:51 · 799 阅读 · 0 评论 -
关于 字节对齐
字节对齐:减少CPU访存次数(以空间换时间),有的cpu必须要求字节对齐,否则出现异常gcc 不支持#pargma pack (8) 按默认的4字节对齐 , vc支持如: struct s{char a; double b;} gcc下可能为12字节,而VC下为16字节(8字节对齐) 对齐的原因是为了减少cpu访问变量的次数,这时补充为8字节没有原创 2013-07-10 18:57:37 · 553 阅读 · 0 评论 -
字符数组定义
#include typedef unsigned char u;int main(){ u8 a[] = {'0x51', '0x52', '0x53', '0x55','\0'}; //这种写法,后面要加'\0' ,否则 sizeof(a) = 4, printf溢出 int n = sizeof(a); //5 printf("n =原创 2013-06-24 19:10:04 · 647 阅读 · 0 评论 -
C/C++ 动态分配内存比较
c语言提供内存动态分配的函数有:malloc、calloc、realloc,在使用这些函数时必须包含其头文件,分别为:、、 1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。原创 2013-06-23 14:09:17 · 751 阅读 · 0 评论 -
定义变量前切记分配内存
保存数据必须要内存如:void fun(int *e){*e = 1;}int main(){int *a ;fun(a);printf("%d",*a);} -----------------------------------------------------------编译出错void fun(int *e){原创 2013-06-24 11:54:23 · 558 阅读 · 0 评论