簡體   English   中英

空字節的格式說明符%s%d和%c的機器級別差異

[英]Machine level difference in format specifiers %s %d and %c for null byte

#include<stdio.h>
#include<stdlib.h>
int main( int argc ,char** argv) {
    int bugs = 100;
    char nul_byte='\0';
    char care_percentage = bugs * nul_byte;
    printf("Which means you should care %s%%.\n",care_percentage);// 1->prints (null)
    printf("Which means you should care %d%%.\n",care_percentage);// 2->prints 0
    printf("Which means you should care %c%%.\n",care_percentage);// 3->prints 
    return 0;
}

問題是最后三個語句1,2和3中到底發生了什么。內部在計算機級別發生了什么。 打印時%s如何將其設為(空),%d如何將其設為0,%c如何將其設為無。

有人可以在機器層面上解釋這些嗎?

首先:這與“機器級別”無關。 這里的所有事情都在運行時或更具體地在printf()的實現中發生。 此外,使用錯誤的格式說明符發生的所有“轉換”都可能會引起麻煩,因為如果您不執行強制轉換,則您將無法保證這些轉換實際上可以正確地傳遞/讀取/解釋(例如,由於長度不同)。參數以符合格式說明符的正確類型。

首先計算:

  • bugs設置為100
  • nul_byte設置為0\\0的實際值)。
  • care_percentage本質上解析為100 * 0 ,它將再次為0

那么,會發生什么呢?

第一種情況:這是一個特例,我不一定要依靠它來做。 本質上,您正在訪問存儲在0x00000000 (這將是無效的位置;可怕的NULL指針)上的字符串,只是很幸運它被捕獲了(不要認為它實際上是定義的行為,但是請隨時證明我是錯誤的)。

第二種情況:傳遞的值被讀取為整數,所以它是0,因為這是實際值(想象在那里發生的(指針)強制轉換)。

第三種情況:傳遞的值將被讀取為字符,這會觸發一種特殊情況,因為它不會直接插入\\0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM