c - 我可以在 for 循环中使用指针的位置/地址作为终止条件吗?
问题描述
所以我知道我可以使用指针的取消引用值作为 for 循环中的条件。但是,我一直在尝试使用指针的位置(在它指向的数组内)作为终止条件。
换句话说,当指针迭代到它所指向的数组的(比如第三个)元素时,终止循环。
下面是我的代码:
int main() {
int *ptr = (int*) calloc(5, sizeof(int));
//returns an int pointer pointing at {0, 0, 0, 0, 0} Correct??
for (int i=0; ptr < ptr+3; ptr++, i++){ //i is for counting
*ptr = i+1; // dereference value of each element into 1
printf("value of %d element of ptr is: %d \n", i, *ptr);
}
return 0;
}
我希望输出是:
value of 0 element of ptr is: 1
value of 1 element of ptr is: 1
value of 2 element of ptr is: 1
但是,我的代码会一直运行和输出,直到达到一个疯狂的高数字 ( ) 时才中断value 1939010 of ptr is: 1939011
。
我不确定我是否误解了指针或者是我的代码中的问题
解决方案
这个for循环
for (int i=0; ptr < ptr+3; ptr++, i++){ //i is for counting
*ptr = i+1; // dereference value of each element into 1
printf("value of %d element of ptr is: %d \n", i, *ptr);
}
是不正确的,因为它调用了未定义的行为。:) 表达式ptr
显然小于表达式ptr + 3
。
您需要的是以下内容
int i = 0;
for ( int *p = ptr; p < ptr+3; p++ ){ //i is for counting
*p = ++i; // dereference value of each element into 1
printf("value of %d element of p is: %d \n", i - 1, *p);
}
也就是说,您需要引入一个指针类型的新变量,该变量将在 for 循环中递增。
推荐阅读
- android - 如何编写 Compose 测试用例来检查在 android 中加载或未加载的 lottie 文件
- spring-boot - Spring批处理尝试创建表
- kotlin - Ktor - 从 Json 文件创建列表
- javascript - 用 aria-valuemin 和 aria-valuemax 覆盖变量?
- docker - 如何创建在运行时也将首先运行依赖目标的规则
- c - 如何在 C 中返回多个不完整类型?
- amazon-web-services - 有没有办法用通配符定义 AWS Glue 输入路径?
- awk - 用另一行匹配模式后修改一行,然后用awk删除另一行
- delphi - 在基类构造函数中调用类函数
- r - 为什么 R 中的 axis.text.x 的 x 轴文本大小没有变大?