为什么*(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纳夫说。谢谢你们。
您不能指望它能起作用:for (i = 0; *(string + i); ++i)
。
每个字符串以0字符结尾的事实并不意味着字符串数组以NULL
指针结尾。
所以*(string + i)
是非法的内存访问,一旦i
变得比2大。
将以上内容更改为:for (i=0; i<sizeof(string)/sizeof(*string); ++i)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句