【C陷阱和缺陷】语义缺陷
一,指针和数组
1) C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来
2) 对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针.
例子1: int a[3];#include<stdio.h>int main(){int calendar[12][31];int (*monthp)[31];for(monthp = calendar; monthp < &calendar[12]; ++monthp){ int *dayp; for(dayp = *monthp; dayp < &(*monthp)[31]; ++dayp) *dayp = 0;}}#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ char *r; char *s = "hi"; char *t = "man"; r = malloc(strlen(s)+strlen(t)+1); //包括最后的'/0',strlen不包括'/0' if(!r){ exit(1); } strcpy(r,s); strcat(r,t); printf("%s\n",r); free(r);}注意:malloc 可能无法正确分配内存,所以要检查是否分配成功 使用完指针,要记得释放。free(char *) 空指针并非空字符串,这个指针绝对不能被解除引用在无符号算术运算中,没有溢出,只有在两个操作数都是有符号数整数时,才可能发生溢出,并且溢出的结果是未定义的。INT_MAX是一个已定义常量,代表可能的最大整数值。在<limits.h>中定义,则可用如下方法确定是否溢出。改变一个正整数的符号都可以保证不会发生溢出,唯一的麻烦来自于改变一个负数的符号的时候。因此,如果保证我们能够保证不将最小负数转换为整数,就能避免。两种方法检测: (1)将a和b都强制转换为无符号整数 if((unsigned)a + (unsigned)b > INT_MAX) ERR (2)直接利用最大值 if(a > INT_MAX -b) ERR
#include<stdio.h>int * bsearch(int *t,int n,int x){int *lo = t,*hi = t + n-1;while(lo < hi){ int *mid = lo + ((hi-lo) >> 1); //不能为int *mid = (hi + lo) / 2因为对指针进行加法是错误的, //只能对指针进行迭代即++或--,或相减计算距离 if(x < *mid){ hi = mid - 1; }else if (x > *mid){ lo = mid + 1; }else{ return mid; } } return NULL;}int main(){ int a[] = {1,2,3,4}; printf("%d",*bsearch(a,4,2));}任何时候已存放的字符数都是bufptr-buffer