none
错误语法带来的奇特现象,求解其背后运作机理 RRS feed

  • 问题

  • 程序非常之短

    #include<stdio.h>

    int main()
    {
     int p[2] = { 'abcd' };
     printf("%s\n", p);
     return 0;
    }

    我知道不能往单引号中填字符串,但……其运行结果是dcba,这个程序会把单引号中的“字符串”(长度不能超过4)反过来输出,打印长度为2的数组却得到了4个字符,这不科学!照理说‘abcd’应该等于‘d'才对啊,求解运作机理!



    2013年11月21日 13:49

答案

  • Free Quark,你好:

    你定义p是整型,但是在printf里用的是%s,如果你把int p[2]改成char p[2],运行结果就是d了。

    2013年11月22日 10:03
    版主
  • 看这里,解释得很清楚 http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters

    简单的说就是 int p[2] = {'abcd'} 相当于:

    char c[] = {'a','b','c','d'};
    int *p = (int*)c;


    2013年11月23日 4:55
  • 其实知道它原理也没啥特别的,但是这个在release模式下开优化不一定会工作

    int是四个字节,'abcd'以int数组四个字节的方式赋值=0x61626364,因为int是低位在低地址,所以在内存里0x61626364,就成了0x64 0x63 0x62 0x61

    打印出来就是dcda。

    但是你这个是写的有问题的,数组第二个int没有值,所以它可能是任何数字,在这个程序里恰好碰到了0 ,不然还有乱码出现。写成int x[2]={'abcd', 0};就稳定了

    你要写成int x[2]={"abcd", 0};输出的又是另一回事


    0xDEADBEEF

    2013年11月24日 17:01
    版主

全部回复

  • Free Quark,你好:

    你定义p是整型,但是在printf里用的是%s,如果你把int p[2]改成char p[2],运行结果就是d了。

    2013年11月22日 10:03
    版主
  • 看这里,解释得很清楚 http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters

    简单的说就是 int p[2] = {'abcd'} 相当于:

    char c[] = {'a','b','c','d'};
    int *p = (int*)c;


    2013年11月23日 4:55
  • 其实知道它原理也没啥特别的,但是这个在release模式下开优化不一定会工作

    int是四个字节,'abcd'以int数组四个字节的方式赋值=0x61626364,因为int是低位在低地址,所以在内存里0x61626364,就成了0x64 0x63 0x62 0x61

    打印出来就是dcda。

    但是你这个是写的有问题的,数组第二个int没有值,所以它可能是任何数字,在这个程序里恰好碰到了0 ,不然还有乱码出现。写成int x[2]={'abcd', 0};就稳定了

    你要写成int x[2]={"abcd", 0};输出的又是另一回事


    0xDEADBEEF

    2013年11月24日 17:01
    版主