32位下printf的坑 輸出錯誤的值

2021-10-10 08:30:07 字數 1126 閱讀 8549

32位編譯

#include

#include

intmain

(int argc,

char

*ar**)

輸出:

a:20 b:0

這是模擬當時的情況,printf想用』』%d』的方式列印兩個變數。但是另乙個輸出為0.

呼叫的堆疊情況。一行4位元組

返回mian的位址

a低位a高位

b指向"a:%d b:%d\n"的位址

printf可以是用va_start,va_end,va_arg這些巨集實現的,大體的**邏輯

va_list va;

va_start

(va,_format)

;char

*p = _format;

for(

;p;p++)}

...}

出現問題的原因是因為使用』%d』輸出64位的變數。『%d』意味著記憶體偏移只有4位元組,而正真需要的是偏移8位元組

驗證:把輸出改為:

printf

("a:%d b:%d c:%d\n"

, a,b)

;

輸出:

a:20 b:0 c:10

甚至可以這樣寫:

#include

#include

#include

struct student

;int

main

(int argc,

char

*ar**)

;printf

("a:%d b:%d c:%d d:%d\n"

, stu)

;getchar()

;return0;

}

輸出:

a:2 b:3 c:4 d:5

以上出現這種情況是32位程式,64位沒有。

stm32 奇怪的位賦值問題 出錯了

1 在51微控制器裡 下面這兩種操作方法都是一樣的,沒有什麼問題!1 out1 r1 是微控制器的乙個io口 dat是傳進來的乙個資料 if dat 0x80 0 out1 r1 0 0是不亮,1是亮 else out1 r1 1 2 out1 r1 dat 0x8000 stm32裡,這樣操作不行...

Windows下32位程式的Inline Hook

話不多說,首先貼 主體參考自一本關於黑客技術的書,書名給忘了。當時只是敲出來跟著用,也沒有深入理解,最近再看,才發現一些原理。inline hook的好處就是可以獲取被hook函式的引數,我們可以自行處理這些資料,再呼叫本來的hook函式。include include include using ...

STM32 DMA傳輸出錯的防錯機制

對於每個 dma 資料流,可在發生以下事件時產生中斷 達到半傳輸 每次傳輸都會觸發,屬於正常觸發 傳輸完成 傳輸錯誤 fifo 錯誤 上溢 下溢或 fifo 級別錯誤 直接模式錯誤 可以使用單獨的中斷使能位以實現靈活性,如 表 43 所示。上訴為f4系列,f1系列中斷只有三個,所以只需處理三個即可。...