任何人都可以參考
va_list
在x86_64 ABI(Linux上使用的那个)中? 我正在尝試除錯一些堆棧或引數似乎已损壞的代碼,這確實有助於理解我應该所见...
最新回復
- 1月前1 #
- 1月前2 #
在i386體系結構中,va_list是指標型別.但是,在AMD64體系結構中,它是一種陣列型別.有什麼不同? 實際上,如果將&操作應用於指標型別,則將获得此指標變數的地址.但是,無論您對陣列型別應用和操作多少次,其值都是相同的,並且等於该陣列的地址。
那麼,您應该在AMD64中做什麼? 在函式中傳遞va_list變數的最簡單方法是不帶*或&運算符来傳遞它。
例如:
void foo(const char *fmt, ...) { va_list ap; int cnt; va_start(ap, fmt); bar(fmt, ap); va_end(ap); return cnt; } void bar(const char *fmt, va_list ap) { va_arg(ap, int); //do something test(ap); } void test(va_list ap) { va_arg(ap, int); //do something }
就可以了! 而且您不必担心有多少論點。
相似問題
- 如何获取Linux(ubuntu)上的视频捕获設備(網路摄像機)列表? (C / C ++)c++clinuxwebcamdevice2021-01-12 01:27
- c:即使使用mathh和庫鏈接-lm也"未定義對'pow'的引用"clinuxmathgcc2021-01-10 19:25
- c:分离的与可連線的POSIX執行緒clinuxpthreadsdetach2021-01-09 20:58
- c++:从編譯的可執行檔案中获取編譯器選項?c++clinux2021-01-09 08:54
我將自己的評論寫成了答案。
這可能会有所帮助.這是參考,尽管是轻量級的( EDIT :原始鏈接已失效; 替換了wayback Machine保留的鏈接)。
可變引數列表參考从第50頁開始,然後繼續,第52-53頁,文件
pva_list
:原来的問题是gcc在製造
va_list
陣列型別.我的功能是簽名:,我想傳遞一个指向
ap
的指標 到另一个功能,所以我做了:不幸的是,陣列型別会衰减為函式引數列表中的指標型別,因此,我没有將指標傳遞给原始結構,而是將指標傳遞给了指標。
要解決此問题,我將代碼更改為:
這是我能想到的唯一便携式解決方案,它解決了
va_list
是陣列型別,可能不是。