| 数据类型 | 访问空间大小 |
|---|---|
| int *p | *p能够访问4字节 |
| char *p | *p能够访问1字节 |
| double *p | *p能够访问8字节 |
#include野指针的成因#include int main() { int a = 10; int *pa = &a; char *pc = &a; printf("%pn",pa); printf("%pn",pa+1); printf("%pn",pc); printf("%pn",pc+1); return 0; }
1、指针未初始化
#include#include int main() { //局部指针未初始化,会指向未知的地址 int *p = 20; return 0; }
2、指针越界访问
#include#include int main() { int arr[10] = {0}; int *p = arr; //指针越界访问 *(p+12) = 20; return 0; }
3、指针指向已经被释放的内存空间
#include如何避免野指针#include int* fun() { int a =10; return &a; } int main() { //函数返回的地址在当前程序中销毁,但指针仍指向这块地址 int *p = fun(); *p = 20; return 0; }
1、初始化指针
int main()
{
//当指针不知道指向谁的时候,可以初始化为空指针
int *p = NULL;
return 0;
}
2、指针用完及时释放
int main()
{
int *p = fun();
*p = 20;
//释放指针,即给指针赋值为空
*p = NULL;
return 0;
}
3、避免指针越界访问数组
4、使用指针前检查指针的有效性
1、指针的加减运算
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &arr[5];
printf("%d n",*(p-1));
printf("%d n",*(p+1));
return 0;
}
2、指针地址减指针地址
#include#include //指针模拟strlen函数 int my_strlen(char * s) { char *start = s; char *end = s; while(*end != ' '){ *end++; } //指针地址相减获得之间相隔多少个数据 return end-start; } int main() { char str[]="hello world"; int n = my_strlen(str); printf("%d",n); return 0; }
3、指针的关系运算
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(int *p = arr;p<&arr[10];p++){
*p = 0;
printf("%d ",*p);
}
return 0;
}



