如何设置int指针终止标记与for循环条件,遍历完堆区整型数组后停止
问题1:sizeof(x)/sizeof(x[0])输出异常原因
x是int*类型的指针,sizeof(x)计算的是指针变量本身的内存占用大小,不是它指向的堆内存的总大小:
- 你运行代码的环境是64位系统,指针占8字节,
int类型占4字节,所以8/4=2,就是你得到的输出结果 - 只有栈上分配的静态数组(比如你代码里的
int a[3])才能用sizeof(数组名)/sizeof(元素)计算长度,动态malloc的堆内存不能用这个方法获取长度,需要你自己手动记录分配的元素个数。
问题2:id-001行修改方案
你当前代码的逻辑有两个问题:
- 前面的循环执行完后,
p已经指向x+6(也就是你malloc的7个int空间的最后一个元素的地址),*(++p)会让指针偏移到x+7,属于堆内存越界访问 '\0'本质是数值0,如果你存入数组的合法值可能出现0,会导致后续判断提前终止,建议选择业务逻辑中不可能出现的数值作为哨兵值,比如如果你的输入都是正整数可以选-1,通用场景可以用INT_MIN(需要引入<limits.h>头文件)
修改示例:
// 如果你确认合法值不会出现0,可以直接修正位置即可 *p = 0; // 如果要避免值冲突,用INT_MIN的话先加#include <limits.h>,再写 *p = INT_MIN;
问题3:id-002行修改方案
你原来的判断条件p!='\0'是判断指针p本身的地址是否等于0,完全不符合需求,你需要判断的是p指向的内存存储的值是否等于哨兵值。
如果用0当哨兵,修改为:
for(int i=0; *p != 0; i++)
如果用INT_MIN当哨兵,修改为:
for(int i=0; *p != INT_MIN; i++)
补充更稳妥的方案:不需要设置哨兵,直接记录你分配的元素个数7,循环条件写
i<7即可,完全避免哨兵值冲突的问题。
内容的提问来源于stack exchange,提问作者Spark
相关产品推荐
相关产品推荐

