引用C++时出错

Mik*_*Sam -5 c++ time loops reference visual-studio

我试着计算通过循环的操作次数为1秒.为此,我记得我开始计算循环并在每次迭代时检查时间的时间.我的想法 - 当这两个时间段的秒数不同时,我打印了多少次循环迭代.

这是我的代码:

#include <ctime>
int main()
{
    // For timing
     time_t t, tstep;
     struct tm* now, *step;

    // this time will change at every iteration
    t = time(0);
    now = localtime(&t);

    // save time of the start moment
    tstep = t;
    step = localtime(&tstep);

    // counter of loop cycles
    int count = 0; 

    for (size_t i = 0; i < 1e100 ; i++)
    {
        // ... here is some calculations    
        t = time(0);
        now = localtime(&t);
        count++;

        if (now->tm_sec != step->tm_sec)
        {
            tstep = time(0);
            step = localtime(&tstep);
             //printf("number of lines %i \n", count );
             count = 0;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是什么:每次刷新都now step变成了同样的价值!虽然ttstep不同!

看起来这是因为引用:也许当我使用tstep = t这个意味着这个变量的地址引用t两者.所以t变化now和变化tstep.

如何解决这个问题呢?如何复制的正义价值tstep?还是有另一种实际的方式?

Som*_*ude 6

localtime函数不是线程安全的,更重要的是不可重入.

它返回的指针很可能是指向内部static缓冲区的指针.这意味着每次localtime调用都会返回指向同一"缓冲区"(结构)的指针.实际上,如果您读取链接引用,则可以在多个函数之间共享缓冲区(结构).

这可以通过使用调试器轻松检查,并比较函数返回的指针.

如果需要不同的值,则需要复制数据而不是复制指针.这可以通过制作nowstep构造实例而不是指针来完成.然后取消引用返回的指针localtime:

struct tm now, step;  // Note: Not pointers!

...

now = *localtime(&t);  // Dereference returned pointer
Run Code Online (Sandbox Code Playgroud)