亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果用錯誤的格式字符串調用printf會發生什么?

如果用錯誤的格式字符串調用printf會發生什么?

C++
喵喵時光機 2019-10-22 22:06:30
或者換句話說:可能錯誤printf/ fprintf十進制整數(%d,%u,%ld,%lld)格式化字符串導致程序崩潰或導致未定義的行為?Cosinder的以下代碼行:#include <iostream>#include <cstdio>int main() {    std::cout << sizeof(int) << std::endl              << sizeof(long) << std::endl;    long a = 10;    long b = 20;    std::printf("%d, %d\n", a, b);    return 0;}在32位架構上的結果:4410, 2064位體系結構的結果:4810, 20無論如何,程序都會打印出預期的結果。我知道,如果該long值超出int范圍,程序將打印錯誤的數字-這很丑陋,但不會影響程序的主要目的-但是除此之外,還會發生意外情況嗎?
查看完整描述

3 回答

?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

如果用錯誤的格式字符串調用printf會發生什么?


什么都可能發生。這是未定義的行為!

未定義的行為意味著任何事情都可能發生。它可能會向您顯示預期的結果,也可能不會,或者可能導致崩潰。任何事情都有可能發生,您只能怪自己,不要怪自己。


參考:


c99標準:7.19.6.1:

第9段:


如果轉換規范無效,則行為未定義。225)如果任何參數都不是對應coverage規范的正確類型,則行為未定義。


查看完整回答
反對 回復 2019-10-22
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

哦,是的-printf取決于格式字符串,以確定接下來要獲取的變量的大小和類型。當格式字符串錯誤時,它可能會嘗試獲取一個甚至不存在的變量,從而可能產生所有后果。


查看完整回答
反對 回復 2019-10-22
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

這是未定義的行為-規范中沒有任何內容告訴編譯器設計器(或C庫設計器)應如何處理,因此允許他們執行任何操作。

在實踐中,完全取決于數字的解釋是其中之一,最有可能的是,這樣做絕對不會給您帶來任何好處。真正糟糕的是,當您將字符串與整數格式混合時-字符串會很好地打印為(奇怪的,也許是)數字,但是當數字作為字符串傳遞時,數字不太可能“起作用”-因為字符串是指向第一個地址的指針字符-大多數數字在典型系統中不是有效的指針,因此會崩潰。

但是,沒有任何保證。在您的64位示例中,很明顯該數字是“ little endian”。嘗試使用0x100000000進行同樣的操作,它會顯示0-因為其余的數字都會丟失。


查看完整回答
反對 回復 2019-10-22
  • 3 回答
  • 0 關注
  • 618 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號