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;
}
我试图在 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;
}