1
#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 如何将其设为空。

有人可以在机器层面解释这些吗?

4

1 回答 1

6

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

首先计算:

  • bugs设置为100
  • nul_byte设置为0(的实际值\0)。
  • care_percentage基本上解决了做100 * 0,这将0再次。

那么,会发生什么?

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

第二种情况:传递的值被读取为整数,所以它是 0,因为那是实际值(想象那里发生的(指针)强制转换)。

第三种情况:传递的值被读取为字符,这里触发了一种特殊情况,因为它没有直接插入到字符串中\0

于 2013-08-03T09:04:58.533 回答