随笔1

1.实数赋值给整型时一般都是去掉小数部分,而不是四舍五入。

float a = 345.92;

char b = a;

printf("%d:%d\n",a,b);

此时输出a是一个很大的数(是因为float在内存中存储方式与整形不同),而b则为89(345转换为16进制为0x159,超过了1个字节所以发生截断)。

2.Free释放内存时传递的是一个指针,那么free是怎么知道要释放多大的内存呢?

如果你有一个malloc到的指针,可以看一下它所指的地址,在前面一点有一个指明分配的空间的大小的数字,这个就是所谓的“释放内存大小的量”。 但是这个数字一般来说不是你malloc或者realloc时候传递的size参数,因为堆分配策略中分配的堆内存不能过于零散,所以一般实际分配的长度是某些特定的值:4B,12B,24B,36B……等等。   

  我们申请一块内存的时候,(以下可能不同系统实现不一样):申请成功,那么系统给我们是一个指针的地址,这个地址里面的某个地方存放着内存块的描述符(包括内存类型和大小)这样,free的时候系统会先读取这个描述符,返回再释放,所以能释放掉所有我们申请的内存。当我们得到一个指针的时候,我们可以对其类型做强制转换,这都不影响内存里面的实际空间大小,释放的时候系统还是能安全释放。

可是如果我们对指针地址做了修改,比如:

char *p = (char *)malloc(sizeof(char) * LEN);

int *i = (int *)p;

那么free(i),OK,没问题;

如果

i = (int *)p + 1;

free(i); 

这样写程序就会挂掉。地址被你改变了,找不到内存块的描述符了,也就不知道内存的类型和大小,自然也就挂了!不过这个存放描述符的地址每个系统都不一样(也有可能有一样的,里面的具体内容也不一样,但linux是肯定不能这样写的)。

3.参数解析

getopt(分析命令行参数)

头文件 #include<unistd.h>

函数原型 int getopt(int argc,char * const argv[ ],const char * optstring);

extern char *optarg;

extern int optind, opterr, optopt;

getopt() 所设置的全局变量包括:

optarg——指向当前选项参数(如果有)的指针。 

optind——再次调用 getopt() 时的下一个 argv 指针的索引。

optopt——最后一个未知选项。

getopt()用来分析命令行参数。参数argcargv是由main()传递的参数个数和内容。参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全局变量optarg 即会指向此额外参数。如果在处理期间遇到了不符合optstring指定的其他选项getopt()将显示一个错误消息,并将全域变量optarg设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。

optstring中的指定的内容的意义(例如getopt(argc, argv, "ab:c:de::");

(1)单个字符,表示选项,(如上例中的abcde各为一个选项)

(2)单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。(如上例中的b:c:

(3)单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg(如上例中的e::,如果没有跟参数,则optarg = NULL)

4.文件映射到内存的意义

文件内的数据就可以用内存读/写指令来访问,而不是用ReadFileWriteFile这样的I/O系统函数,从而提高了文件存取速度。这种函数最适用于需要读取文件并且对文件内包含的信息做语法分析的应用程序,如:对输入文件进行语法分析的彩色语法编辑器,编译器等。

把文件映射后进行读和分析,能让应用程序使用内存操作来操纵文件,而不必在文件里来回地读、写、移动文件指针。

4.字符串查找函数

原型:size_t strcspn(const char *s1,const char *s2);

功能:顺序在字符串s1中搜寻与s2中字符的第一个相同字符,包括结束符NULL,返回这个字符在S1中第一次出现的位置。说明:(返回字符串s1中第一个在s2中出现的字符在s1中的下标值,亦即在s1中出现而s2中没有出现的子串的长度。)

 

函数原型:char *strstr(const char *str1, const char *str2);

返回值:该函数返回str2第一次在str1中的位置,如果没有找到,返回NULL

 

5.strtoul (将字符串转换成无符号长整型数)

unsigned long strtoul(const char *nptr,char **endptr,int base);

strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从236,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。当base值为0时会根据情况选择用哪种进制:如果第一个字符是'0',就判断第二字符如果是‘x’则用16进制,否则用8进制;第一个字符不是‘0’,则用10进制。一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

 

6.int asprintf(char **strp, const char *fmt, ...);功能:

asprintf()可以说是一个增强版的sprintf(),在不确定字符串的长度时,非常灵活方便,能够根据格式化的字符串长度,申请足够的内存空间。此外,使用完后,必须通过free()释放空间。不过,这是GNU扩展的C函数库,不是标准C函数库或者POSIX

头文件:asprintf.h

 

7.qsort编译器函数库自带的快速排序函数

功 能: 使用快速排序例程进行排序

头文件:stdlib.h

用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

参数: 

待排序数组首地址

数组中待排序元素数量

各元素的占用空间大小

指向函数的指针,用于确定排序的顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值