那些尝试过的bug、
bug 1: malloc(sizeof(1024))
why always segmentation fault?
本着分配1024字节空间的伟大使命,使用这条命令,sizeof(1024),真的不是sizeof(int)的意思吗。。
bug 2: 宏=请加括号!
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
int intheline(point a,point b,point c) {
if (a.x>=min(b.x,c.x) && a.x<=max(b.x,c.x) &&
a.y>=min(b.y,c.y) && a.y<=max(b.y,c.y)) {
printf("a.y=> %f\n",a.y);
printf("b.y=> %f\n",min(b.y,c.y));
printf("c.y=> %f\n",max(b.y,c.y));
return 1;
}
return 0;
}
/* output */
a.y=> 0.000000
b.y=> 1.000000
c.y=> 2.000000
我当时就震惊了! 0竟然比1大? 为什么!!
等我细细回味之时,宏拓展之后、一切都明了了
要么利用临时变量储存值,在进行比较,或者直接将min定义为 ((a)<(b)?(a):(b)) 到处是陷阱啊!!
bug3: 如果你在c里,请先声明!
/*print_float.c*/
#include <stdio.h>
void print_float(float f)
{
printf("%f\n",f);
}
#include <stdio.h> /*main.c*/
int main(void)
{
float f = 22.2222;
print_float(f);
return 0;
}
MacOS> gcc main.c print_float.c -o main
MacOS>./main
MacOS>0.0000
输出是0.0000而不是22.2222,最好编译时用-Wall解决这种因为没有显式声明,参数float型被默认为是int的问题~ 当然-Wall解决很多问题,加上它!
bug4: 强制转换时请注意括号!
char *buf = (char*)malloc(1024);
unsigned short *shortp = (unsigned short*) buf + 12;
unsigned short *shortp2 = (unsigned short*) (buf + 12);
将buf转换成unsigned short 时,忘记了加括号, 误以为shortp是shortp2,当强制转换后,加12,是以(unsigned short)为单位的... 结果访问了不对的数据