我写这段代码是为了我大学的一个抽样作业。

#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.127125ms
时间:1557335682.635813潜伏期:200.146914 ms
时间:1557335682.835952潜伏期:200.139046 ms
时间:1557335683.036075潜伏期:200.123072 ms
时间:1557335683.236192发散:
-5032897650754812101515983244655326161601410332108977075030071649323120821786695393776059934682357033173949374411776492565454001284240265552387957819489233902588461216017208320581165836856344089221817741213696.000000毫秒
时间:1557335683.436400潜伏期:1557335683436.399902 ms
时间:1557335683.636521潜伏期:1557335683636.520752 ms
时间:1557335683.836647潜伏期:1557335683836.646973 ms
有人知道第五次计算的奇怪结果是什么吗。我无法想象任何合理的解释,因为我以前从未遇到过类似的“bug”。这与gettimeofday()函数的某些特性有关吗?
注:输入为10200

最佳答案

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

samples = malloc(nsamples);

函数为指定的字节数而不是数组元素数分配空间。所以你的数组比你想象的要短得多。这意味着您最终将通过调用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++;
}

关于c - gettimeofday()上的奇怪戳记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56046095/

10-09 07:14