把结构体放在主函数里修改,没有错误,但是用函数返回修改,就出现了问题

把结构体放在主函数里修改,没有错误,但是用函数返回修改,就出现了问题

#include <stdio.h>

struct time{
    int hour;
    int minutes;
    int seconds;
};

struct time timeUpdate(struct time now);

int main(void)
{   
    struct time testTimes[]={
        {00,00,00},{06,00,01},{12,01,02},{18,02,03},{23,59,59}
    };
        int i;
        for(i=0;1<5;i++) {

        printf("%i : %i : %i \n",
        testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);

        testTimes[i] =timeUpdate(testTimes[i]);

        printf("%i : %i : %i \n",
        testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds); 
        }
    return 0;
}

struct time timeUpdate(struct time now)
{
    ++now.seconds;
    if(now.seconds==60){
        now.seconds=0;
        ++now.minutes;
        if(now.minutes==60){
            now.minutes=0;
            ++now.hour;
            if(now.hour==24){
                now.hour=0;
            }
        }
    }
}

这是很正常的,因为函数调用的时候,参数now是拷贝了一份在堆栈上,你修改的是堆栈上的副本,而不是主程序里的那个 testTimes
同时你的函数没有返回修改之后的now

修改方法1

应该用指针或者引用

比如

#include <stdio.h>

struct time{
    int hour;
    int minutes;
    int seconds;
};

struct time timeUpdate(struct time * now);

int main(void)
{   
    struct time testTimes[]={
        {00,00,00},{06,00,01},{12,01,02},{18,02,03},{23,59,59}
    };
        int i;
        for(i=0;1<5;i++) {

        printf("%i : %i : %i \n",
        testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);

        timeUpdate(&testTimes[i]);

        printf("%i : %i : %i \n",
        testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds); 
        }
    return 0;
}

struct time timeUpdate(struct time * now)
{
    ++(now->seconds);
    if(now->seconds==60){
        now->seconds=0;
        ++(now->minutes);
        if(now->minutes==60){
            now->minutes=0;
            ++(now->hour);
            if(now->hour==24){
                now->hour=0;
            }
        }
    }
}

修改方法2

或者让它返回now

#include <stdio.h>

struct time{
    int hour;
    int minutes;
    int seconds;
};

struct time timeUpdate(struct time now);

int main(void)
{   
    struct time testTimes[]={
        {00,00,00},{06,00,01},{12,01,02},{18,02,03},{23,59,59}
    };
        int i;
        for(i=0;1<5;i++) {

        printf("%i : %i : %i \n",
        testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);

        testTimes[i] =timeUpdate(testTimes[i]);

        printf("%i : %i : %i \n",
        testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds); 
        }
    return 0;
}

struct time timeUpdate(struct time now)
{
    ++now.seconds;
    if(now.seconds==60){
        now.seconds=0;
        ++now.minutes;
        if(now.minutes==60){
            now.minutes=0;
            ++now.hour;
            if(now.hour==24){
                now.hour=0;
            }
        }
    }
        return now;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^