御笔剑客 发表于 2017-11-18 01:36:57

关于下列代码的问题

#include <stdio.h>
int main()
{
        int a={1,2,3,4,5};
        int *ptr=a;
        int count=0;
       
        while(*ptr++!='\0')
        count++;
        printf("%d",count);
        return 0;

}

为什么最终count会等于7而不是5呢?

3-3 发表于 2017-11-18 08:21:02

本帖最后由 3-3 于 2017-11-18 08:22 编辑

while(*ptr++!='\0')
循环的判断条件不对。 数组一共只有5个元素,最后一个元素就是5, 它不是字符串。按照你这样写,那么指针就一直往后读内在,直到读到'\0'为止,越界了。

BngThea 发表于 2017-11-18 09:16:06

对于整形数组,不能拿'\0'作为数据结束的判断依据,只有字符数组才行

<(¥_$)> 发表于 2017-11-18 10:31:41

本帖最后由 <(¥_$)> 于 2017-11-18 10:38 编辑

这要从栈的结构说起了
这里就拿vc++6.0的debug编译结果举例

局部变量在栈中的分布如图

int、int*在32位程序中都占4字节
ptr指针指向a数组,循环寻找到4字节为0数据时候的停止,可以看出数组a首地址距离下一个4字节为0数据相差了13个4字节,所以,我这里输出的结果为13

所以说,你这个程序在不同环境下编译,甚至不同环境下运行都有不确定性

另外说一点,就这个程序而言,count可以写成
count = sizeof(a) / sizeof(a);












页: [1]
查看完整版本: 关于下列代码的问题