[英]Difference between format specifiers %s and %c for "*p" and "p" in string
[英]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.