不恰当的指针声明
int * ptr1,ptr2; //第一个是int*,第二个是int型
int * ptr1,* ptr2;//两个都是int*
#define PINT int*
PINT ptr1,ptr2; //第一个是int*,第二个是int
typedef int* PINT; //定义为类型
PINT ptr1,ptr2; //第一个和第二个都是int*型
- 使用指针之前要进行初始化
- 一般用NULL初始化
- 使用malloc类函数后一定要检测一下返回值,检测内存是否分配成功。
一定要匹配指针类型
在小端模式下,不匹配形成的问题
int num=2147483647;
int*pi=#
short *ps=(short*)pi;
printf("%p,%x,%d",pi,*pi,*pi);
printf("%p,%hx,%hd",ps,*ps,*ps);
100,7fffffff,2147483647
100,ffff,-1
数组越界访问
在使用数组时,一定注意不要越界访问,防止越界访问的方法有,传参时,一同传入数组的长度。
在将数组名赋给指针的时候,指针也要防止出现此种越界的问题。
指针算术运算和结构体
我们应该只对数组使用指针算术运算,因为数组肯定分配在连续的内存块上,不应该将它们用在结构体内,因为结构体的字段可能分配在不连续的内存区域。
typedef struct employee
{
char name[10];
int age;
} Employee;
内存释放问题
-
重复释放问题
避免这类漏洞的简单方法是释放指针后总是将其置为NULL,大部分堆管理器都会忽略后续对空指针的释放。 -
清除敏感数据
一旦不再需要内存中的敏感数据,马上进行覆写是个好主意。因为当应用程序终止后,大部分操作系统都不会把用到的内存清零,可能将它们分配给别的程序,其它程序就可以访问敏感数据了。
char name[32];
int userID;
char*securityQuestion;
//删除敏感信息
memset(name,0,sizeof(name));
userID=0;
memset(securityQuestion,0,strlen(securityQuestion));