【发布时间】:2020-08-01 15:59:15
【问题描述】:
看看下面的代码和输出:
char *words[] = {"wehrmarcht", "collectorate", "hello", "hello","precorrection", "hello","wehrmarcht"};
char *wp;
cnode *np;
for(wp = *words; wp - *words < sizeof(words); wp += strlen(wp) + 1) {
printf("wp -> %s\n", wp);
}
printf("==============================================\n");
for(int i = 0; i < sizeof(words) / sizeof(char *); i++) {
printf("words[%d] -> %s\n", i,words[i]);
}
输出:
wp -> collectorate
wp -> precorrection
wp -> wp -> %s
wp -> ==============================================
==============================================
words[0] -> wehrmarcht
words[1] -> collectorate
words[2] -> hello
words[3] -> hello
words[4] -> precorrection
words[5] -> hello
words[6] -> wehrmarcht
Process finished with exit code 0
有人能解释一下是什么让 wp 指向代码中的某些字符串吗? 提前致谢。
【问题讨论】:
-
您是否假设包含只读字符串文字的段与代码中的出现顺序有某种关联?
-
当你的程序使用文字字符串(例如“...”)时,这些字符串是程序的一部分,它是常量初始化数据的区域(你不能修改它们),你访问这个区域,你的for about wp 从“wehrmarcht”的地址开始(所以你的输出不能是你给出的那个)然后在那个内存部分进行,当然这一切都取决于如何编译器/链接器放置数据并且行为未定义
-
一些编译器可以选择共享/合并重复的字符串字面量,而
"hello"出现了三次,这真的会打乱常规序列的假设。 -
@WeatherVane 标记的答案证实了你的想法,这确实有道理。
标签: c string pointers memory string-literals