C/C++中的strlen问题

char str[][9]={"hello","welcome"};
char *p=str[0];
printf("%d",strlen(p+10));
为什么输出结果为6?
而把10去掉,即改为strlen(p)后,则输出结果为5?

很好解释。
第一,为什么输出结果为6?
首先,你定义了一个二维数组,一分量是 2,二分量是 9,总共 18 个元素。注意,这是重点。你的 p 指向的是 str[0][0] 即为 'h'。在 "hello" 后面跟着的是 4 个 NULL。而数组在内存中连续排放,所以 p+10 指向了 str[1][1] 即为 'e',所以从 strlen(p+10) 得出的结果是 6(为什么?看下一个解答。)。
第二,为什么把10去掉,即改为strlen(p)后,则输出结果为5?
看看 strlen 的工作原理——遍历数组中的元素,输出遇到的第一个 NULL 前的元素个数。然后你就懂了。追问

为什么在hello后面跟着4个NULL呢?
按照下面strlen的工作原理的话,第一个输出的是5才对啊?

追答

很简单啊,因为你定义的数组是九个元素,你只排满了前面五个,后面自然就是 NULL 了。

还有疑问欢迎继续……

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-16
很好解释。
第一,为什么输出结果为6?
首先,你定义了一个二维数组,一分量是 2,二分量是 9,总共 18 个元素。注意,这是重点。你的 p 指向的是 str[0][0] 即为 'h'。在 "hello" 后面跟着的是 4 个 NULL。而数组在内存中连续排放,所以 p+10 指向了 str[1][1] 即为 'e',所以从 strlen(p+10) 得出的结果是 6(为什么?看下一个解答。)。
第二,为什么把10去掉,即改为strlen(p)后,则输出结果为5?
看看 strlen 的工作原理——遍历数组中的元素,输出遇到的第一个 NULL 前的元素个数。然后你就懂了。追问为什么在hello后面跟着4个NULL呢?
按照下面strlen的工作原理的话,第一个输出的是5才对啊?
第一次 输出的是 elcome 的长度 所以是6本回答被提问者采纳
第2个回答  2012-08-16
str是一个2行9列的二维数组,p指向第1个字符串“hello”;
二维数组是按行优先线性存放的,即str[1]字符串"welcome"紧跟在str[0]后存放;
p+10从str[0]的第0行第0个元素,向后10个地址空间到了第1行第1个元素,即字母'e',strlen(p+10)计算的是字符串"elcome"的长度为6。

而strlen(p)计算的是第1个字符串“hello”的长度,因为始终指向str[0]。
相似回答