【问题标题】:Iterating struct array by pointer arithmetic通过指针算法迭代结构数组
【发布时间】:2015-04-13 11:55:30
【问题描述】:

我正在尝试通过指针算法迭代结构数组。但是它给了我无法理解的结果。

#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++; 指针使步长等于 sizeof(Time) 并指向任何地方。

标签: c arrays struct pointer-arithmetic


【解决方案1】:

问题是你试图增加一个不指向数组的指针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)。

【讨论】:

    【解决方案2】:

    我认为在程序的第二部分中,您的意思如下

        //...
    
        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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2011-08-15
      • 2018-09-04
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多