新浪博客

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地址执行程序

我的更多文章

下载客户端阅读体验更佳

APP专享