可能产生非法指针的原因:
- 指针未初始化:声明指针后,没有为其分配内存就直接使用,例如
int *ptr; *ptr = 10;
,这里ptr
未初始化,是一个非法指针。
- 内存释放后继续使用:调用
free
函数释放内存后,没有将指针设置为NULL
,导致继续使用已释放的内存,例如int *ptr = (int *)malloc(sizeof(int)); free(ptr); *ptr = 10;
,释放后ptr
指向的内存已无效,但仍在使用。
- 数组越界:访问数组时超出数组的有效范围,例如
int arr[5]; int *ptr = &arr[10];
,arr[10]
超出了数组arr
的范围,ptr
成为非法指针。
- 函数返回局部变量指针:函数内定义局部变量,返回指向该局部变量的指针,函数结束时局部变量销毁,指针指向无效内存,例如:
int *func() {
int num = 10;
return #
}
解决方案:
- 初始化指针:在声明指针后,立即为其分配内存或设置为
NULL
。例如int *ptr = NULL; ptr = (int *)malloc(sizeof(int));
,先初始化为NULL
,再分配内存,避免使用未初始化指针。
- 释放后设为NULL:调用
free
释放内存后,将指针设置为NULL
。例如int *ptr = (int *)malloc(sizeof(int)); free(ptr); ptr = NULL;
,这样后续使用ptr
时,由于是NULL
指针,可避免访问已释放内存导致的问题。
- 避免数组越界:在访问数组元素时,确保索引在有效范围内。可以通过循环条件等方式控制,例如:
int arr[5];
for (int i = 0; i < 5; i++) {
// 安全访问arr[i]
}
- 返回动态分配内存的指针:如果函数需要返回一个指针,改为返回动态分配内存的指针,调用者负责释放内存。例如:
int *func() {
int *ptr = (int *)malloc(sizeof(int));
*ptr = 10;
return ptr;
}
int main() {
int *result = func();
// 使用result
free(result);
return 0;
}