2.野指针的防范策略
a.初始化指针:在声明指针变量时,应将其初始化为NULL或有效的内存地址。
例如:
1#include <stdio.h>
2#include <stdlib.h>
3
4int main(int argc, char *argv[]) {
5 // 初始化指针为NULL
6 int *ptr = NULL;
7
8 // 检查指针是否为NULL,再进行内存分配
9 if (ptr == NULL) {
10 ptr = (int *)malloc(sizeof(int));
11 if (ptr == NULL) {
12 printf("Memory allocation failed.\n");
13 return 1;
14 }
15 }
16
17 *ptr = 10;
18 printf("Value: %d\n", *ptr);
19
20 // 使用完内存后,释放它
21 free(ptr);
22 // 将指针重置为NULL,避免成为悬挂指针
23 ptr = NULL; // 将指针重置为NULL,避免成为悬挂指针
24
25 return 0;
26}
b.检查指针边界:在访问数组或其他数据结构时,确保指针在有效范围内。
例如:
1#include <stdio.h>
2
3int main(int argc, char *argv[]) {
4 int arr[5] = {1, 2, 3, 4, 5};
5 int *ptr = arr;
6 int index;
7 // 确保索引在数组范围内
8 for (index = 0; index < 5; index++) {
9 printf("%d ", *(ptr + index));
10 }
11
12 // 如果需要动态地确定数组的大小,请务必确保不要越界
13 int size = sizeof(arr) / sizeof(arr[0]);
14 for (index = 0; index < size; index++) {
15 printf("%d ", arr[index]);
16 }
17
18 return 0;
19}
c.避免误操作:不要随意修改指针的值,特别是在不知道指针指向的具体内容时。
例如:
1#include <stdio.h>
2
3void modifyPointerSafely(int **pptr, int newValue) {
4 // 只有在确认pptr和*pptr都有效时才修改指针指向的值
5 if (pptr != NULL && *pptr != NULL) {
6 **pptr = newValue;
7 }
8}
9
10int main(int argc, char *argv[]) {
11 int *ptr = (int *)malloc(sizeof(int));
12 if (ptr == NULL) {
13 printf("Memory allocation failed.\n");
14 return 1;
15 }
16
17 *ptr = 10;
18 printf("Original value: %d\n", *ptr);
19
20 // 安全地修改指针指向的值
21 modifyPointerSafely(&ptr, 20);
22 printf("Modified value: %d\n", *ptr);
23
24 free(ptr);
25 ptr = NULL;
26
27 return 0;
28}
在这个例子中,我们定义了一个函数modifyPointerSafely,它接受一个指向指针的指针和一个新值。这个函数在修改指针指向的值之前,首先检查传入的指针和它所指向的指针是否都不为NULL。这样可以确保我们不会意外地修改一个无效的指针。
请注意,虽然这些示例展示了如何防范野指针的常见策略,但在实际编程中,还需要结合代码审查、动态分析工具和其他安全措施来确保程序的健壮性。
|