#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]是指向“板球”起始地址的指针。等。
我的问题是:
通过观察这些地址,我们可以看到第二个字符串存储在第一个字符串的空字符之后。所有三个字符串都以顺序形式存储。这总是如此吗?
答案 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]。