【发布时间】:2012-04-25 03:30:13
【问题描述】:
char i;
for(i=0;i<16;i++)
printf("%c","asdf"[i]);
i=1;
if("123"[i]==1)
i=1;
if("456"[4]==1)
i=1;
if("789"[1]==1)
i=1;
输出是:
asdf 123 456
似乎大多数“字符串”在内存中是紧接在一起的。我不认为这是随机的,或者是吗? 此外,当我在 char-access-expression 中使用 int 变量而不是 i 时程序失败,这不是第一个(这里是 asdf[i])。例如if("123"[j]==1)
谁能给我解释一下?
【问题讨论】:
-
编译器通常会将所有常量字符串收集到一个“字符串表”中。这样做时可能会删除重复的字符串;例如: "hello\0" 和 "lo\0" 可能最终在字符串表中折叠。
-
但是为什么“789”不在这张桌子上呢?这取决于访问索引,还是看起来如此?
-
@user1329846:可能是编译器在编译时计算了
"789"[1],但没有计算"456"[4]。字符串在内存中的位置不是由 C 标准定义的,所以这里没有任何保证,这就是为什么你应该避免你正在尝试做的事情。
标签: c arrays string memory char