c语言指针的错误使用,C语言指针常见错误用法
C語言指針常見錯誤用法
1、使用未初始化的指針
int *p;
*p = 5;
解釋:p是一個指向未知地址的指針,給p賦值,相當(dāng)于給一個未知地址的內(nèi)存賦值,非常危險。
2、錯用指針
int changeP(int *p) {
int b = 5;
p = &b;
}
int a = 3;
int *p = &a;
changeP(p);
解釋:changeP的參數(shù)p是一個臨時變量,所以把這個臨時變量指向&b(b的地址),不能改變p =
&a的結(jié)果。
3、錯用指針
void GetMemory(char *p, int n)
{
p = (char *)malloc(sizeof(char) *
num);
}
char *str = NULL;
GetMemory(str, 100);
這里,
GetMemory的第一個參數(shù),實際傳入的是NULL,顯然不是想要的結(jié)果。應(yīng)該用二級指針,參數(shù)用&str
4、錯用二級指針
void initStack(Stack **A);
Stack **A;
initStack(A);
解釋:A直接作二級指針傳入,作為參數(shù),就被一個臨時變量替代,所以在函數(shù)里面,是沒有辦法對A分配內(nèi)存的。應(yīng)該定義Stack
*A,然后用&A做參數(shù)
5、錯用二級指針初始化
int **array = (int **)malloc(sizeof(int) * ROWS *
COLS);
解釋:這里,array是一個數(shù)組,數(shù)組的元素是int*。所以在malloc的時候,應(yīng)該是sizeof(int*)
6、數(shù)組指針的用法
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
問:*(ptr-1)的值是多少?
解釋:&a是一個數(shù)組指針,指針類型是int[5],所以+1就相當(dāng)于加了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兩個指針應(yīng)該首先指向一個地址,而不是用*m,*n直接賦值,賦值在一個未知的地址上
8、指針地址:靈活形式
int * p = (int *)10000;
解釋:這里10000相當(dāng)于一個內(nèi)存地址,p就是指向10000地址的一個指針;
9、未分配內(nèi)存的指針
char a;
char *str=&a;
strcpy(str,”hello”);
解釋:str未分配內(nèi)存,做字符串拷貝,會導(dǎo)致內(nèi)存越界問題
10、函數(shù)指針
int (*s1)(int);
int (*s2[10])(int);
解釋:s1是一個 指向int func(int)類型函數(shù)的指針;
s2是一個指向int func(int)類型函數(shù)的指針的數(shù)組;
11、從0地址執(zhí)行程序
*((void (*)( ))0) ( );
解釋:
1、void (*)()定義了一個void()類型的函數(shù)指針;
2、把0強(qiáng)制轉(zhuǎn)換為一個指向void()類型函數(shù)的指針;
3、*取指針的內(nèi)容,即調(diào)用這個函數(shù);
免費(fèi)C/C++課程:
https://ke.qq.com/course/181957
QQ:30822533
總結(jié)
以上是生活随笔為你收集整理的c语言指针的错误使用,C语言指针常见错误用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 随机文字,按键精灵安卓随
- 下一篇: CentOS 7 Crontab 用法