C语言数据结构笔记5:Keil 编译器优化行为_malloc指针内存分配问题

记录俩个keil5 STM32 的c语言编程中 ,编译器优化行为 和 指针内存分配问题。

目录

[关闭Keil 编译器优化行为:](#关闭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;
}
相关推荐
小汉堡编程30 分钟前
数据结构——vector数组c++(超详细)
数据结构·c++
巴伦是只猫37 分钟前
【机器学习笔记Ⅰ】11 多项式回归
笔记·机器学习·回归
雾里看山4 小时前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
DKPT4 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
巴伦是只猫6 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习
学不动CV了6 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
好好研究7 小时前
学习栈和队列的插入和删除操作
数据结构·学习
猫猫的小茶馆8 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
pumpkin845149 小时前
Rust 调用 C 函数的 FFI
c语言·算法·rust
挺菜的9 小时前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法