gettimeofday()上的奇怪戳记

时间:2019-05-08 17:25:24

标签: c gettimeofday

我已经在大学里编写了此代码用于抽样作业。

#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv){
    struct timeval tv;

    float t = atoi(argv[1]);  //sampling time period in sec's
    float dt = atoi(argv[2]);   //sampling rate in msec's
    double time;
    int nsamples = t/dt * 1000; //number of samples floored

    //samples storage array
    double *samples;
    samples = malloc(nsamples);

    printf("%d\n\n",nsamples);

    int c = 0;  //array index
    double divergance;

    gettimeofday(&tv, NULL);
    time =(double) tv.tv_sec + tv.tv_usec / 1000000.0f;
    samples[c] = time;
    printf("time: %f\n", samples[c]);

    usleep(dt * 1000);

    while(c<nsamples){
      c++;

      gettimeofday(&tv, NULL);
      time = (double) tv.tv_sec + tv.tv_usec / 1000000.0f;
      samples[c] = time;

      //divergance calculated in msec's
      divergance = (samples[c] - samples[c-1]);
      if (c==9){
        printf("%f \n \n%f", samples[c-1], samples[c]);
      }
      printf("time: %f\ndivergance: %f ms\n\n", samples[c], divergance*1000);

      usleep(dt *1000);
    }

}

这是我的输出

  

时间:1557335682.435666发散:200.127125毫秒

     

时间:1557335682.635813发散:200.146914毫秒

     

时间:1557335682.835952分歧:200.139046毫秒

     

时间:1557335683.036075发散度:200.123072 ms

     

时间:1557335683.236192分歧:   -5032897650754812100215159832446553261601414103321089770750300716493231241208217866953937760599346823570331739493744117764925654540012842402655523878795775819489233146901362588461216017208320541658368563434403808909221817741213696.000000 ms

     

时间:1557335683.436400发散:1557335683436.399902 ms

     

时间:1557335683.636521发散:1557335683636.520752 ms

     

时间:1557335683.836647发散度:1557335683836.646973 ms

有人在第五次计算中了解什么奇怪的输出吗?我无法想象任何逻辑上的解释,因为我之前从未遇到过任何类似的“错误”。它与gettimeofday()函数的某些特定功能有关吗?

注释:输入为10200

2 个答案:

答案 0 :(得分:3)

您没有为samples分配足够的空间:

samples = malloc(nsamples);

malloc函数为指定数量的 bytes (而不是数组元素的数量)分配空间。因此,您的数组比您想象的要短得多。这意味着您最终将在数组末尾进行写操作,并调用undefined behavior

您需要将元素数量乘以元素大小以分配正确的空间量:

samples = malloc(nsamples * sizeof(*samples));

在访问数组时,您还会遇到一个错误:

int c = 0;
...
while(c<nsamples){
  c++;
  ...
  samples[c] = time;
  ...
}

这还将超出数组末尾,特别是一个数组元素过多。

将循环更改为从值1开始并在结尾处递增。

int c = 0;
...
c = 1;
while(c<nsamples){
  ...
  samples[c] = time;
  ...
  c++;
}

答案 1 :(得分:0)

malloc(3)的参数为要分配的字节的数目,而不是样本的数目。如果您打算分配一个floatdouble样本数组,则最好在将该参数传递给{{之前,将其乘以sizeof (float)(或sizeof (double))。 1}}。由于malloc(3)被定义为指向samples的指针,因此您应该使用:

double

或更好(如果您碰巧更改了samples = malloc(nsamples * sizeof(double)); 的声明):

samples