预期输出与实际输出不匹配,请解释代码背后的逻辑

时间:2018-11-20 12:28:12

标签: c arrays string pointers c-strings

    #include<stdio.h>

    int main()

    {

    char *str[] = {"Frogs","Do","Not","Die.","They","Croak"};

    printf("%c %c %c",*str[0],*str[1],*str[2]);//expected F D N

    printf("\n%u %u %u",str[0],str[1],str[2]);//expected 1000 1006 1003

   }

此输出基于froak从1000开始的假设

输出如下

F D N

2162395060 2162395057 2162395053

这怎么可能,这里地址从str[0]减小到str[2],打印str[3]str[4]str[5]的地址,显示没有模式,而是地址突然改变了

1 个答案:

答案 0 :(得分:4)

您正在打印三个字符串常量的地址。编译器没有义务以任何可预测的方式组织字符串常量。

要求编译器提供一个指针数组。可以顺序访问该数组以获得字符串常量的地址,但是可以将字符串常量存储在编译器认为有效或有用的任何位置。

我使用AppleClang 10.0.0.10001044在Mac OS上运行了相同的代码,并得到以下输出:

F D N
104431486 104431492 104431495

如您所见,指针使用AppleClang是顺序的。

但是,这无关紧要。您的代码中的任何内容都不应取决于编译器如何选择为字符串常量分配内存。