[英]Why would this work: Array of pointers to C strings?
为什么在所有字符串打印完后,这样的*(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 nuff说。 多谢你们。
您不能指望它能起作用: for (i = 0; *(string + i); ++i)
。
每个字符串以0字符结尾的事实并不意味着字符串数组以NULL
指针结尾。
因此,只要i
大于2, *(string + i)
就是非法的内存访问。
将以上内容更改为: for (i=0; i<sizeof(string)/sizeof(*string); ++i)
。
您在世界上未定义的行为-一切都会发生。
只需在数组末尾添加NULL
字符串文字为null隐式终止: "Hello"
在幕后变为{ 'H', 'e', 'l', 'l', 'o', '\\0' }
(并且成为具有6个插槽的数组)。
但是,上述仅适用于字符串( char
数组),且仅当它们使用一个字符串字面或已经采取添加空终止的护理有关的功能创建的。 其他类型的数组(包括字符串数组,如此处所示)不一定以null结尾。 当然,您可以通过在末尾手动添加null来使它们以null终止,只要该数组有一个额外的插槽即可存储null。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.