通过指针算法迭代结构数组

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 Timemalloc,而不是数组。这就是为什么当您递增该指针时,行为是未定义的。

但是,增加指向 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;

将指向数组的第二个元素。