错误一:
语法错误:
1.将“==”写成了“=”
2.复合语句忘记加{ }
3.用数学表达式来写逻辑表达式
例如: 6<x<29
应写为6<x&&x<29
4.没有切换中英文
编译错误:
比如字符串中字符没有写规范,转义字符忘记加\等
这些错误一般编译器都会报错,比较容易进行改正。
错误二:
数组越界:
数组越界一般包含两种情况:
(1)写越界:
即数组长度大于定义时的长度,但是由于越界后的地址到底里面有什么东西我们不知道,我们如果将它改变了,而他又是很重要的数据,那么就会造成很严重的后果。
(2)读越界
即读到的地方不是数组内部的数据,有可能读出的是随机数,如果要用读到的数据,那么可能会得到一个错误的数据导致程序出错。
错误三
内存泄漏:
在写链表或者其他东西时我们会使用malloc来开辟出一块自己想要的空间,但当我们将这块空间使用完毕以后一定要用free来将其释放掉,不然这块空间会一直存在,如果这种情况一直发生,那么我们可以使用的内存空间会越来越小。
错误四
野指针:
我们定义一个指针时可以直接定义其指向,或者只定义指针而不定义其指向,比如 :
int a;
int* p=&a;
或者
int* p;
第二种情况就是只定义了一个指针而没有定义指针的指向,所以p中存放的地址就是一个随机地址,这个地址可能内存中并不存在,也可能是内存中一块重要数据的地址,这时候我们如果使用p的话,那就会很危险。
所以当我们定义指针时,如果不定义其指向的话,我们可以让其等于NULL,这样就不怕p会指向我们不知道的地方了。
错误五
访问空指针:
上面我们说过,如果一个指针没有说明其指向,建议让其等于NULL,但是如果指针为NULL时,我们就不能通过指针来访问该地区的数据,如果访问,系统会报错。
例如:
下面程序的输出结果是( )
#include <stdio.h>
#include <stdlib.h>
void MallocMem(char* pc)
{
pc = (char*) malloc (100);
return;
}
int main()
{
char *str=NULL;
MallocMem(str);
strcpy(str,"hello ");
strcat(str+2, "world");
printf("%s",str);
return 0;
}
该程序运行时会崩溃。
因为char *str=NULL;是先定义了一个空指针,调用函数MallocMem(str)在传参时传的是str的值,所以这就是一个值传递,我们知道值传递时是不会改变变量原本的值的,所以尽管给pc开了一个100字节大小的空间,但是pc与str实际是两个变量,所以str的值还为NULL,给NULL里面进行拷贝和连接便会程序崩溃。
错误六
引用未初始化的变量:
有时候我们定义一个变量以后忘记对其进行初始化,这时候如果是局部变量,那么他会是一个随机值,如果是全局变量或者静态局部变量,那么他的值会是0.
这时候我们要使用这个变量的话得到的结果就可能是错的。
错误七
对指针偏移错误:
我们有时会通过指针来访问数组,对数组元素进行访问时也可以通过对指针的加减运算来访问。
但是要注意的是同类型指针只能减不能加,因为如果两个同类型的指针进行加法运算,那么得到的就是两个地址的合,这样是没有意义的。
还要注意不要对指针偏移过量,这样可能会造成数组越界。
错误八
函数返回值不能是一个局部变量的指针:
我们知道函数中的局部变量当函数执行结束时会被销毁,如果函数返回的是一个指向局部变量的指针,这时候局部变量已经被销毁了,该指针的指向就不是我们想要的东西了。