Max*_*Max 3 c arrays struct pointer-arithmetic
我试图通过指针算法迭代结构数组.然而它给了我无法理解的结果.
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int hours;
int minutes;
int seconds;
} Time;
void time_print(Time t)
{
printf("Time is: %d:%d:%d\n", t.hours, t.minutes, t.seconds);
}
int main(void)
{
Time *testTimePointers[2];
testTimePointers[0] = malloc(sizeof(Time));
testTimePointers[0]->hours = 11;
testTimePointers[0]->minutes = 10;
testTimePointers[0]->seconds = 9;
testTimePointers[1] = malloc(sizeof(Time));
testTimePointers[1]->hours = 7;
testTimePointers[1]->minutes = 6;
testTimePointers[1]->seconds = 5;
time_print(*(testTimePointers[0]));
time_print(*(testTimePointers[1]));
printf("=============\n");
Time *ttp_cur = NULL;
ttp_cur = testTimePointers[0];
time_print(*(ttp_cur));
ttp_cur++;
time_print(*(ttp_cur));
free(testTimePointers[0]);
free(testTimePointers[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是
Time is: 11:10:9
Time is: 7:6:5
=============
Time is: 11:10:9
Time is: 0:0:0
Run Code Online (Sandbox Code Playgroud)
在第二个块中,第二行应该是Time is: 7:6:5而不是Time is: 0:0:0.
问题是您正在尝试增加ttp_cur不指向数组的指针.
您尝试增加的值ttp_cur来自testTimePointers[0],而后者又来自malloc单个struct Time数组,而不是数组.这就是为什么当你增加指针时,行为是未定义的.
但是,增加指向testTimePointers数组的指针是可以的.如果你这样做了
Time **ttp_cur_p = testTimePointers;
time_print(*(*ttp_cur_p));
ttp_cur_p++;
time_print(*(*ttp_cur_p));
Run Code Online (Sandbox Code Playgroud)
你会得到你期望的结果(演示).
我认为在程序的第二部分你的意思是以下
//...
Time **ttp_cur = testTimePointers;
time_print(**ttp_cur );
ttp_cur++;
time_print(**ttp_cur);
free(testTimePointers[0]);
free(testTimePointers[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个像这样的数组
T a[2];
Run Code Online (Sandbox Code Playgroud)
哪里T是某个类型说明符,那么指向其第一个元素的指针将按以下方式声明
T *p = a;
Run Code Online (Sandbox Code Playgroud)
和表达
++磷;
将指向数组的第二个元素.
现在如果要考虑你的阵列
Time *testTimePointers[2];
Run Code Online (Sandbox Code Playgroud)
然后类型说明符T将等于Time *.因此,指向数组第一个元素的指针的声明将如下所示
Time **ttp_cur = testTimePointers;
Run Code Online (Sandbox Code Playgroud)
和表达
++ttp_cur;
Run Code Online (Sandbox Code Playgroud)
将指向数组的第二个元素.
| 归档时间: |
|
| 查看次数: |
1108 次 |
| 最近记录: |