C/C++中的strlen问题

charstr[][9]={"hello","welcome"};char*p=str[0];printf("%d",strlen(p+10));为什么输出结果为6?而把... char str[][9]={"hello","welcome"};
char *p=str[0];
printf("%d",strlen(p+10));
为什么输出结果为6?
而把10去掉,即改为strlen(p)后,则输出结果为5?
展开
 我来答
zishengrenshi
2012-08-16 · TA获得超过150个赞
知道小有建树答主
回答量:135
采纳率:0%
帮助的人:108万
展开全部
很好解释。
第一,为什么输出结果为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 了。

还有疑问欢迎继续……

403012698
2012-08-16 · 超过11用户采纳过TA的回答
知道答主
回答量:66
采纳率:0%
帮助的人:24万
展开全部
很好解释。
第一,为什么输出结果为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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
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]。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式