Линейно разнесенный массив в C - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь реплицировать функции linspace из Matlab и numpy (python) в C, однако я получаю предупреждение о разыменовании нулевого указателя .

Я очень новичок в 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

Очевидно, я уверен, что это просто ошибка ладьи ie, но я не уверен, как ее отсортировать!

Спасибо.

1 Ответ

3 голосов
/ 15 марта 2020

Следующее сообщение:

Warning C6011   Dereferencing NULL pointer 'x'. Line 14

не является ошибкой во время выполнения. Это очень плохо сформулированное предупреждение, выданное компилятором Microsoft C ++ (см. https://docs.microsoft.com/en-us/cpp/code-quality/c6011?view=vs-2019) о возможности о том, что вы можете разыменовать указатель, который может быть NULL во время выполнения.

Ваш указатель будет NULL, если calloc() не удастся выделить память, случайность, о которой вам, вероятно, не нужно беспокоиться, но чтобы компилятор был доволен и предотвратил предупреждение, вы можете захотеть ASSERT() что указатель не равен NULL перед продолжением разыменования указателя.

И если вы хотите написать совершенно надежный код, то вам нужно добавить код, который делает вашу функцию изящно терпящей неудачу, если calloc() возвращает NULL.

...