在打印完所有字符串后,为什么这样的检查*(string + i)
不会通过?
printf("%p", string + i + 1);
的输出肯定显示string + i + 1
不是NULL
我已经用几个数量的字符串多次尝试了这段代码
也许一些C大师可以给出答案吗?提前致谢。 :-)
代码:
#include <stdio.h>
int
main(void)
{
size_t i;
char *string[] = {
"Hey, baby!",
"How are ya?",
"What the heck is going on in here?"
};
for (i = 0; *(string + i); ++i)
{
printf("%s\t%p\n", *(string + i), string + i);
}
printf("%p", string + i + 1);
return 0;
}
输出:
[aenry@MintK50ID 2]$ ./test
Hey, baby! 0x7fff691978e0
How are ya? 0x7fff691978e8
What the heck is going on in here? 0x7fff691978f0
0x7fff69197900%
[aenry@MintK50ID 2]$ gcc -v
...
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
--------编辑: 事实证明,这实际上是垃圾代码,并且某种方式只有gcc 以其工作的方式编译它。 UB努夫说。谢谢,伙计们。
答案 0 :(得分:3)
您不能指望这样做:for (i = 0; *(string + i); ++i)
。
每个字符串以0字符结尾的事实并不意味着字符串数组以NULL
指针结尾。
*(string + i)
变为大于2时,i
是非法内存访问。
将上述内容更改为:for (i=0; i<sizeof(string)/sizeof(*string); ++i)
。
答案 1 :(得分:1)
你是世界上未定义的行为 - 所以任何事情都可能发生。
只需在数组末尾添加NULL
答案 2 :(得分:0)
字符串文字隐式地以空值终止:"Hello"
在幕后变为{ 'H', 'e', 'l', 'l', 'o', '\0' }
(并且它变成具有6个插槽的数组)。
但是上面的字符串(char
数组)仅适用 ,而仅如果使用字符串文字或已经使用的函数创建注意添加空终止符。其他类型的数组(包括字符串数组,就像你在这里一样),不一定是空终止的。当然,只要数组有一个额外的槽来存储空值,就可以通过在末尾手动添加null来使它们终止为空。