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。这样可以确保我们不会意外地修改一个无效的指针。
请注意,虽然这些示例展示了如何防范野指针的常见策略,但在实际编程中,还需要结合代码审查、动态分析工具和其他安全措施来确保程序的健壮性。
|