通过指针算法迭代struct数组

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.

das*_*ght 7

问题是您正在尝试增加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)

你会得到你期望的结果(演示).


Vla*_*cow 5

我认为在程序的第二部分你的意思是以下

    //...

    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)

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