通过指针算法迭代结构数组
Iterating struct array by 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;
}
结果
Time is: 11:10:9
Time is: 7:6:5
=============
Time is: 11:10:9
Time is: 0:0:0
在第二个块中,第二行应该是Time is: 7:6:5
而不是Time is: 0:0:0
。
问题是您试图递增一个不指向数组的指针 ttp_cur
。
您尝试递增的值 ttp_cur
来自 testTimePointers[0]
,后者又来自单个 struct Time
的 malloc
,而不是数组。这就是为什么当您递增该指针时,行为是未定义的。
但是,增加指向 testTimePointers
数组的指针是可以的。如果你这样做了
Time **ttp_cur_p = testTimePointers;
time_print(*(*ttp_cur_p));
ttp_cur_p++;
time_print(*(*ttp_cur_p));
您会得到预期的结果 (demo)。
我认为在程序的第二部分中你的意思如下
//...
Time **ttp_cur = testTimePointers;
time_print(**ttp_cur );
ttp_cur++;
time_print(**ttp_cur);
free(testTimePointers[0]);
free(testTimePointers[1]);
return 0;
}
如果你有一个像
这样的数组
T a[2];
其中 T
是某种类型说明符,然后指向其第一个元素的指针按以下方式声明
T *p = a;
和表达式
++p;
将指向数组的第二个元素。
现在考虑你的阵列
Time *testTimePointers[2];
则类型说明符 T
将等于 Time *
。所以指向数组第一个元素的指针的声明看起来像
Time **ttp_cur = testTimePointers;
和表达式
++ttp_cur;
将指向数组的第二个元素。
我正在尝试通过指针算法迭代结构数组。但是它给了我无法理解的结果。
#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;
}
结果
Time is: 11:10:9
Time is: 7:6:5
=============
Time is: 11:10:9
Time is: 0:0:0
在第二个块中,第二行应该是Time is: 7:6:5
而不是Time is: 0:0:0
。
问题是您试图递增一个不指向数组的指针 ttp_cur
。
您尝试递增的值 ttp_cur
来自 testTimePointers[0]
,后者又来自单个 struct Time
的 malloc
,而不是数组。这就是为什么当您递增该指针时,行为是未定义的。
但是,增加指向 testTimePointers
数组的指针是可以的。如果你这样做了
Time **ttp_cur_p = testTimePointers;
time_print(*(*ttp_cur_p));
ttp_cur_p++;
time_print(*(*ttp_cur_p));
您会得到预期的结果 (demo)。
我认为在程序的第二部分中你的意思如下
//...
Time **ttp_cur = testTimePointers;
time_print(**ttp_cur );
ttp_cur++;
time_print(**ttp_cur);
free(testTimePointers[0]);
free(testTimePointers[1]);
return 0;
}
如果你有一个像
这样的数组T a[2];
其中 T
是某种类型说明符,然后指向其第一个元素的指针按以下方式声明
T *p = a;
和表达式
++p;
将指向数组的第二个元素。
现在考虑你的阵列
Time *testTimePointers[2];
则类型说明符 T
将等于 Time *
。所以指向数组第一个元素的指针的声明看起来像
Time **ttp_cur = testTimePointers;
和表达式
++ttp_cur;
将指向数组的第二个元素。