能否将指针的地址/位置作为for循环的终止条件?
问题根本原因
- 你的循环终止条件逻辑存在错误:
ptr < ptr + 3中,判断两侧的ptr都是当前循环迭代的最新值。每次循环执行ptr++后,ptr + 3也会同步向后偏移1个int类型的长度,这个判断永远为真,因此程序会进入无限循环,直到指针越界访问非法内存触发崩溃。 - 补充说明:你代码注释中对
calloc的理解是正确的,calloc(5, sizeof(int))确实会申请5个int长度的连续内存,且自动初始化为全0,返回指向这段内存首地址的int类型指针。
正确修改方案
你需要提前保存数组的起始地址作为固定基准,再和移动的指针做比较,修改后的代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr = (int*) calloc(5, sizeof(int)); int *start = ptr; // 保存数组起始地址作为固定基准 for (int i=0; ptr < start + 3; ptr++, i++){ // 如果你预期每个元素值都是1,直接写*ptr = 1即可 // 你原来的写法*ptr = i+1 会输出1、2、3,和你的预期不符 *ptr = 1; printf("value of %d element of ptr is: %d \n", i, *ptr); } // 申请的堆内存要记得释放,避免内存泄漏 free(start); return 0; }
运行上述代码就会输出你预期的结果。
内容的提问来源于stack exchange,提问作者Mahmoud Gabr
相关产品推荐
相关产品推荐

