C语言指针指向数组的一个小疑惑

C语言了解的不够渗透,想请问一个简单的问题
如果定义了一个数组 unsigned char *temp[]={0X01,0X02};
可知,temp数组里面有2个元素
如果 有个循环是 while(*temp!=0){temp++;}; 这个样子的
可知 temp=0的时候,它的值是0x01 因为不等于0,所以进入循环
然后temp++,再次判断*temp是不是等于0,因为 此时temp的地址加1了,它的值就是 0x02 了,这个应该都好理解吧,因为0x02不等于0,所以 while循环又是真的
在while循环里面,再给 temp++
因为temp数组里面只有2个元素,如果此时temp地址再加1的话,数组里面已经没元素了,此时 while(*temp!=0) 应该怎么判断呢?

    首先,这个数组的初始化是错误的,在定义中temp是一个数组,数组中的元素是指向unsigned char类型的指针,因此用整型的0X01和0X02初始化指针是错误的。应改为

    其次,如上定义,当循环到数组界外时,由于此时*temp的值是随机的,因此while(*temp  != 0)的结果也是随机的。这种行为叫做数组越界访问,是一个Bug,不应出现在程序里。

    再次,改正方案,

    不知道对你有没有帮助。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-29
1. temp用做array名称时,已经不能进行temp++计算。其代表之数据是固定的。
2. 依照宣告,temp是array,内放两个元素,元素之型态是char *,
分别代表 address:0x01 & address:0x02
3. 你要讨论的应该是 char *ptr 的ptr计算,超过阵列范围吧。
在指标计算中,他不会考虑所存取或代表之阵列的长度,
指标变量就只是个数据值,可以随便你加减。
指标变量超过范围时,那就会存取到其他变量或记忆体位置,
这里要小心控制指标的存取,可能会引起功能错误,系统错误讯息,或是当机。
4. 对於Array,建议采用Array存取,比较安全。采用*ptr要自己控制好安全性。
可在数组尾巴加一个不会使用到的值,当作结尾,例如0x00。

直接编程测试看看,每个改变都记得印出相关变量的数值,应该就会比较清楚变化。

参考资料:自己

本回答被网友采纳
第2个回答  2012-11-29
LZ你这种定义的方式可能是不对的 unsigned char *temp[]={0X01,0X02};
现在手头没有编译器没有办法验证。
所以也不太理解后面while循环中*temp是表达什么含义。
对指针判断条件为0时(*p == 0),一般是判断指针是否为空,对字符串数组来说最后一位会默认是‘\0’,也就是空了,可以通过这种方式判断字符串数组是否结束。
第3个回答  2012-11-29
你的代码应该会有一个警告和一个错误..
警告:类型不匹配, 你要这样改:unsigned char *temp[] = {(char *)0x01, (char *)0x02};

错误:数组名是常量, 任何试图改变数组名的操作都是非法的, 所以temp++是非法的.
第4个回答  2012-11-29
每一个数组的结尾都有一个 '\0' ('\0'的ASCII代码为0)是等价的 也就是说while(*temp!='\0')和 while(*temp!=0) 是等价的。也就是说循环条件是没有问题的。
相似回答