C 中的线性间隔数组

Linearly Spaced Array in C

我试图在 C 中从 Matlab 和 numpy (python) 复制 linspace 函数,但是,我不断收到关于 取消引用空指针 的警告。

我是 C 语言的新手,之前只在 Matlab、python 和 lua 工作过,指针是非常值得尝试和思考的东西!

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

 double* linspace(double init, double fin, int N) {
     double *x;
     int i = 0;
     double step = (fin - init) / (double)N;
     x = (double*)calloc(N, sizeof(double));

     x[i] = init; /*<=== Line 14*/

     for (i = 1; i < N; i++) {
         x[i] = x[i - 1] + step;
     }
     x[N - 1] = fin;
     return x;
}

int main() {
    double *x_array = linspace(0, 10, 1000);

    printf(&x_array);

    free(x_array);
    return 0;
}

我得到了确切的警告:

Warning C6011   Dereferencing NULL pointer 'x'. Line 14

显然我确定这只是一个菜鸟错误,但我不确定如何对它进行排序!

谢谢。

以下留言:

Warning C6011   Dereferencing NULL pointer 'x'. Line 14

不是运行时错误。这是 Microsoft C++ 编译器(参见 https://docs.microsoft.com/en-us/cpp/code-quality/c6011?view=vs-2019)关于 可能性 发出的措辞非常糟糕的警告,您可能正在取消引用在运行时 可能 NULL 的指针。

如果 calloc() 分配内存失败,你的指针将是 NULL,你可能不需要担心这种情况,但为了让编译器满意并防止警告,你可能在继续取消引用指针之前,想要 ASSERT() 指针不是 NULL

如果您想编写完美健壮的代码,那么您需要添加使您的函数正常失败的代码 calloc() returns NULL.

您的步数计算有误。应该是:

double step = (fin - init) / (double)N-1;

对于非常大的数组,如果使用以下方法,速度可以提高 X2:

double* linspace(double x1, double x2, int n) {

 double *x = calloc(n, sizeof(double));

 double step = (x2 - x1) / (double)(n - 1);

 for (int i = 0; i < n; i++) {
     x[i] = x1 + ((double)i * step);
 }
 
return x;
}