?記錄倆個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; }