【问题标题】:Segmentation faults in atoi and argv using FFTW使用 FFTW 的 atoi 和 argv 中的分段错误
【发布时间】:2013-12-09 09:49:32
【问题描述】:

我正在尝试使用 fftw3 库运行 FFT 的示例。我用调试标志重新编译了我的代码,并做了一个回溯,这给了我:

    gdb) backtrace
    #0  0x0000003e3a037172 in ____strtoll_l_internal () from /lib64/libc.so.6
    #1  0x0000003e3a033f20 in atoi () from /lib64/libc.so.6
    #2  0x0000000000400887 in main (argc=1, argv=0x7fffffffc998) at fftw_ex.c:7

但是回到我的代码,我看不出它有什么问题:

    #include <stdio.h>
    #include <stdlib.h>
    #include <complex.h>
    #include "fftw3.h"
    int main(int argc, char* argv[])
    {
      printf("argc is: %d\n", argc);
      printf("argv[1] is: %d\n", *argv[1]);
      printf("argv[2] is: %d\n", *argv[2]);
      int n=atoi(argv[1]);
      int i, cutoff = atoi(argv[2]);

    // ^seg faults here according to backtrace^ //

      double *x=malloc(n*sizeof(double));
      for(i=0; i<n; ++i) x[i]=((double) rand())/((double)RAND_MAX+1.0);
      printf("x=[");
      for(i=0; i<n; ++i) printf("%15.7g ",x[i]);
      printf("];\n\n");

      double complex *in, *out;

      fftw_plan p;

      in  = (double complex*) fftw_malloc(sizeof(double complex) * n);
      out = (double complex*) fftw_malloc(sizeof(double complex) * n);

      for(i=0; i<n; ++i) in[i]=(x[i]+0.*I);

      p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
      fftw_execute(p);
      fftw_destroy_plan(p);

      printf("y=[");
      for(i=0; i<n; ++i)
        printf("%15.7g + %15.7gi ", 1./((double) n)*creal(out[i]), 1./((double) n)*cimag(out[i]));
      printf("];\n\n");
      out[0]=0.+0.*I;
      p = fftw_plan_dft_1d(n, out, in, FFTW_BACKWARD, FFTW_ESTIMATE);
      fftw_execute(p);
      printf("z=[");
      for(i=0; i<n; ++i)
        printf("%15.7g + %15.7gi ", 1./((double) n)*creal(in[i]), 1./((double) n)*cimag(in[i]));
      printf("];\n\n");
      for(i=1; i<n/2+1; ++i)
        if (i > cutoff)
          out[i]=out[n-i]=0.+0.*I;
        printf("r=["); for(i=0; i<n; ++i)
        printf("%15.7g + %15.7gi ", 1./((double) n)*creal(out[i]), 1./((double) n)*cimag(out[i]));
      printf("];\n\n");
      fftw_execute(p);
      printf("q=["); for(i=0; i<n; ++i)
      printf("%15.7g + %15.7gi ", 1./((double) n)*creal(in[i]), 1./((double) n)*cimag(in[i]));
      printf("];\n\n");
      fftw_destroy_plan(p);
      fftw_free(in);
      fftw_free(out);
    }

编辑:更新代码 - argc 值为 3,因此索引似乎是正确的。我还打印了我的 argv 值以查看我在哪里得到了段错误,但现在事情开始起作用了!我很惊讶...

【问题讨论】:

  • 这是应该是C++还是C?

标签: segmentation-fault argv fftw atoi


【解决方案1】:

在访问argv数组之前检查argc的值;你不能超越argv[argc-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多