在连续的内存位置存储字符串文字

Deb*_*ish 5 c c++ arrays string pointers

    #include <stdio.h>
    #include <string.h>
    int main() {

    char *s[] = {"cricket","tennis","football"};

    printf(" String are: \n\n");
    printf("  %s \n", *(s));
    printf("  %s \n", *(s+1));
    printf("  %s \n", *(s+2));
    printf("  \n\n");

    printf("  Starting locations of the string are: \n\n");

    printf("  %d\n",*(s));
    printf("  %d\n",*(s+1));
    printf("  %d\n",*(s+2));
    printf("  \n\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

String are: 

cricket 
tennis 
football 


Starting locations of the string are: 

134514112
134514120
134514127
Run Code Online (Sandbox Code Playgroud)

s是一个字符指针数组.s有三个元素,每个元素都存储字符串literal的起始地址.s [0]是一个指向"cricket"起始地址的指针.等等..

我的问题是:

通过观察这些地址,我们可以看到第二个字符串存储在第一个字符串的空字符之后.所有三个字符串都以顺序形式存储.这总是如此吗?

Ser*_*gio 9

这是一个链接器决定 - 紧密存储或不存储字符串文字.没有保证.或者甚至可以通过编译器来完成 - 它可以创建包含所有相关文字的连续数据部分.但是,该部分的实际布局仍然是特定于实现的,您不应该假设它.

  • @Debashish没有什么可以解释的.如果您想了解特定系统的详细信息,则需要阅读链接器手册. (5认同)
  • @Debashish:另外,你会发现有趣的是,如果你的代码中有两个相同的文字字符串,那么链接器可能会选择在可执行映像中只生成一个副本(同样,标准不能保证). (3认同)
  • @barakmanos ...或者如果你有,例如``string``和``large string"`,它可能会识别冗余并将前者映射到等效地址_within_后者.我很确定我已经看到过这种情况.但它同样是一个实现细节,并不完全由语言保证. (3认同)
  • @Debashish:简而言之,它不是由语言标准决定的(既不是C也不是C++). (2认同)