定义指针时要初始化啊

问题描述:

0x0FB91BC0 (ucrtbased.dll)处(位于 five.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
在这里插入图片描述

emmm,这个问题呢,网上有很多解答,就是指针和数组越界的问题;
内存错误 未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突

今天有个同学问我一个问题,就是碰见了这一串的0x00000000,我也是第一次碰见这玩意儿,上网搜了搜,原来是指针和数组越界了;

  • 道理是明白了,可是这几百来行的代码实在是看的人眼花缭乱,我不断的调啊调,终于将问题锁定在了strlen这里:
    在这里插入图片描述
  • 接着找到这个showText一看,得是个指针;
    在这里插入图片描述
  • 眼瞅着是没啥问题,可咋就一直报错呢?结果是她在主函数里调用了一个函数,又通过这个函数调用另一个函数,通过最后一函数使用了这个strlen(showText),这东跑西跑,突然出现错误就傻了😢;
  • 到中间一看,showText还是原来那个showText,一直到调用一点没变,最开始也没有赋值,就是个char *showText;,那可不就妥妥的得出错

结果困扰她老久的问题,就是给showText赋值,问题就解决了

定义指针时记得要赋值,路边的野花虽然香,但是不要随便采啊

我偶尔也这么定义指针,今天一看,这错误不大,但确实让人脑阔痛
所以在定义指针的时候,千万不要偷懒啊,不然到时候成百上千行代码,搁哪儿找这错误啊

在C/C++中,指针定义初始化是一种常见且危险的做法。指针变量如果没有被显式初始化,其值是未定义的,这意味着它可能指向内存中的任意位置访问或解引用这样的指针会导致不可预测的行为,包括程序崩溃、数据损坏或安全漏洞。 ### 指针初始化导致的问题 1. **野指针(Dangling Pointer)**:当指针初始化,它可能指向一个随机的内存地址。如果尝试通过该指针读取或写入数据,则可能导致非法内存访问[^1]。 2. **程序崩溃(Segmentation Fault)**:如果未初始化指针指向了受保护的内存区域,操作系统可能会终止程序以防止系统稳定性受损[^2]。 3. **数据损坏**:指针指向未知内存并进行写操作,可能会覆盖其他变量的数据或程序结构,从而引发逻辑错误或程序状态异常[^1]。 4. **调试困难**:由于未初始化指针的行为具有不确定性,这类问题往往难以复现和调试,增加了维护成本[^2]。 ### 正确初始化指针的方法 1. **静态初始化为 NULL 或 nullptr** 在定义指针将其初始化为 `NULL`(C语言)或 `nullptr`(C++11 及以上),表示该指针当前不指向任何有效对象。 ```c int *ptr = NULL; // C语言 ``` ```cpp int *ptr = nullptr; // C++11+ ``` 2. **动态分配内存** 使用 `malloc`(C语言)或 `new`(C++)为指针分配内存,并确保检查返回值是否为 NULL 以避免后续访问失败。 ```c int N, *p; scanf("%d", &N); p = (int *)malloc(N * sizeof(int)); // C语言动态分配 if (p != NULL) { // 使用 p free(p); // 释放内存 } ``` ```cpp int *p = new (std::nothrow) int[10]; // C++ 动态分配并避免抛出异常 if (p != nullptr) { // 使用 p delete[] p; // 释放数组内存 } ``` 3. **指向已存在的变量** 指针可以初始化为已有变量的地址,这样可以直接对其进行操作。 ```cpp int value = 42; int *ptr = &value; // ptr 指向 value ``` 4. **使用智能指针(C++ 特有)** 对于现代 C++ 程序开发,推荐使用标准库提供的智能指针如 `std::unique_ptr` 和 `std::shared_ptr` 来自动管理资源生命周期,减少手动内存管理的风险。 ```cpp #include <memory> std::unique_ptr<int[]> data(new int[10]); // 自动释放内存 data[0] = 123; ``` 5. **多级指针初始化与释放** 对于二级指针或多级指针结构,应逐层分配内存并确保每一层都正确释放。 ```cpp int **p = (int **)malloc(a * sizeof(int *)); for (int i = 0; i < a; ++i) { p[i] = (int *)malloc(a * sizeof(int)); } // ... 使用 p ... for (int i = 0; i < a; ++i) { free(p[i]); } free(p); ``` 6. **编译器警告与工具辅助** 启用编译器警告选项(如 `-Wall -Wextra`)可以帮助发现潜在的未初始化变量问题。此外,使用静态分析工具(如 Clang Static Analyzer、Coverity)以及运行检测工具(如 Valgrind)也能有效识别野指针相关缺陷。 ### 小结 未初始化指针是一个严重的编程隐患,可能导致各种不稳定行为。通过良好的编码习惯,如及初始化、合理分配与释放内存,以及利用现代 C++ 的智能指针机制,可以显著降低此类风险的发生概率。同,借助开发工具的支持,可以在早期阶段捕获这些问题,提高代码质量和安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值