C语言指针常见错误用法
2017-01-19 16:39阅读:
C语言指针常见错误用法
1、使用未初始化的指针
int *p;
*p = 5;
解释:p是一个指向未知地址的指针,给p赋值,相当于给一个未知地址的内存赋值,非常危险。
2、错用指针
int changeP(int *p) {
int b = 5;
p = &b;
}
int a = 3;
int *p = &a;
changeP(p);
解释:changeP的参数p是一个临时变量,所以把这个临时变量指向&b(b的地址),不能改变p =
&a的结果。
3、错用指针
void GetMemory(char *p, int n) {
p = (char *)malloc(sizeof(char) * num);
}
char *str = NULL;
GetMemory(str, 100);
这里,
GetMemory的第一个参数,实际传入的是NULL,显然不是想要的结果。应该用二级指针,参数用&str
4、错用二级指针
void initStack(Stack **A);
Stack **A;
initStack(A);
解释:A直接作二级指针传入,作为参数,就被一个临时变量替代,所以在函数里面,是没有办法对A分配内存的。应该定义Stack
*A,然后用&A做参数
5、错用二级指针初始化
int **array = (int **)malloc(sizeof(int) * ROWS *
COLS);
解释:这里,array是一个数组,数组的元素是int*。所以在malloc的时候,应该是sizeof(int*)
6、数组指针的用法
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
问:*(ptr-1)的值是多少?
解释:&a是一个数组指针,指针类型是int[5],所以+1就相当于加了sizeof
(int[5])个byte,所以ptr指向了5后面的地址,ptr是int类型指针,ptr-1就指向了元素5的位置。
7、指针错误被赋值
void findmax(int *p,int *q,int k) {
int i,*m,*n;
*m=*p; *n=*q;
for (i=0;i小于k;i++) {
if(*p > *m) {*m=*p;*n=*q;}
p++; q++;
}
解释:m,n两个指针应该首先指向一个地址,而不是用*m,*n直接赋值,赋值在一个未知的地址上
8、指针地址:灵活形式
int * p = (int *)10000;
解释:这里10000相当于一个内存地址,p就是指向10000地址的一个指针;
9、未分配内存的指针
char a;
char *str=&a;
strcpy(str,”hello”);
解释:str未分配内存,做字符串拷贝,会导致内存越界问题
10、函数指针
int (*s1)(int);
int (*s2[10])(int);
解释:s1是一个 指向int func(int)类型函数的指针;
s2是一个指向int func(int)类型函数的指针的数组;
11、从0地址执行程序