C语言数据结构笔记5:Keil 编译器优化行为_malloc指针内存分配问题
记录俩个keil5 STM32 的c语言编程中 ,编译器优化行为 和 指针内存分配问题。
目录
关闭Keil 编译器优化行为:
malloc指针内存分配问题
多层嵌套的结构体:
用指针取值:
发现问题:
解决问题:
示例代码
关闭Keil 编译器优化行为:
在这里关闭,之前因为有编译器优化,导致作为参数传入处理的数组被清理了:
malloc指针内存分配问题
多层嵌套的结构体:
我这有一个多层嵌套的结构体:这里不展示完全结构,
它的定义结构类似于这篇文章提到的结构体嵌套的结构:
C语言数据结构笔记3:Union联合体+结构体取8位Bool量-CSDN博客
用指针取值:
指针获取结构体嵌套的某层结构体地址的值
但它没有被malloc分配空间
发现问题:
下载到STM32平台,结果发现每次上电后,第一次取值打印没问题,
后续都有问题,指针跑偏了:
而且是在第一次获取发送完正确的值之后,它瞬间把结构体存的值给修改了,导致后面都是读取的同一错误的值
但同样逻辑读取的最简函数的工程都没问题
解决问题:
添加malloc分配空间与free指针就行了:
最后补充一句:实测不指向NULL,重复获取寄存器值会卡死
示例代码
以下是一个简单的示例,演示如何使用
malloc
分配内存,然后使用free
释放内存:#include <stdio.h> #include <stdlib.h>int main() {int n = 5; // 示例:分配一个包含 5 个整数的数组int *arr;// 分配内存arr = (int *)malloc(n * sizeof(int));// 检查内存分配是否成功if (arr == NULL) {printf("内存分配失败\n");return 1;}// 使用分配的内存for (int i = 0; i < n; i++) {arr[i] = i * 10; // 示例赋值}// 打印数组内容for (int i = 0; i < n; i++) {printf("arr[%d] = %d\n", i, arr[i]);}// 释放内存free(arr);// 将指针设置为 NULL,防止悬空指针arr = NULL;return 0; }