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

时间:2016-08-17 12:49:01

标签: 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;
}

输出:

String are: 

cricket 
tennis 
football 


Starting locations of the string are: 

134514112
134514120
134514127

是一个字符指针数组。 s有三个元素,每个元素都存储字符串literals.i.e的起始地址。 s [0]是指向“板球”起始地址的指针。等。

我的问题是:

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

我有一个例子给你:

#include <stdio.h>
#include <inttypes.h>

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

int main( void ) 
{
    int i;

    for( i=0; i<2; i++ ) {
        printf( "%" PRIuPTR "\n", (uintptr_t)s[i] );
        // or printf( "%p\n", s[i] ); forr hex output
    }
}

如果我使用gcc -O3编译并运行该程序,我会得到:

4195869
4195865

这里发生的是优化器将两个字符串文字合并为一个“足球”,以便s[0]变为s[1] + 4

这只是编译器/链接器可能决定如何存储字符串文字的一个例子......

答案 2 :(得分:-1)

它完全取决于编译器。编译器可以在执行开始时获取任何地址

答案 3 :(得分:-3)

只有静态数组在内存中是连续的。例如:char s [1024]。