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

expected output and the practical output not matching, please explain the logic behind the code

    #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]的地址, 没有显示任何模式,而是地址突然变化

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

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

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

F D N
104431486 104431492 104431495

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

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