格式说明符%s%d的机器级别差异和空字节的%c

时间:2013-08-03 08:55:53

标签: c

#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如何(null)和%d将其视为0,%c在打印时将其视为空白。

有人可以在机器深度解释这些吗?

1 个答案:

答案 0 :(得分:6)

首先:这与“机器级别”无关。这里的所有内容都发生在运行时或更具体地发生在printf()的实现中。此外,通过使用错误的格式说明符发生的所有“转换”可能会找到麻烦,因为您无法保证这些实际上是正确传递/读取/解释(例如由于长度不同),如果您没有投射参数为格式说明符的正确类型。

首先计算:

  • bugs设置为100
  • nul_byte设置为0\0的实际值)。
  • care_percentage基本上解决了100 * 00再次{。}}。

那么,会发生什么?

第一种情况:这是一个特殊情况,我不一定会依赖它。你实际上是访问存储在0x00000000的字符串(这将是一个无效的位置;可怕的NULL指针),你很幸运它被捕获(不要认为它实际上是定义的行为,但随意证明我错了。)

第二种情况:传递的值被读作一个整数,所以它是0,因为那是实际值(想象那里发生了(指针)演员)。

第三种情况:传递的值被读作一个字符,这会触发一个特殊情况,因为它不会像\0一样直接插入字符串。