Как исправить переполнение буфера и различия между заполнением массива внутри n за пределами основной функции - PullRequest
0 голосов
/ 29 апреля 2020

Я пишу код, в котором компилятор предупреждает меня о переполнении буфера. Я не смог избавиться от этого предупреждения, которое в конечном итоге привело к сбою моей программы в вычислениях, поэтому я решил решить эту проблему для более простого примера, и здесь я нашел кое-что интересное, это мой код:

    #include <stdlib.h>
    #include <stdio.h>
    double* T(int n, int h, int tp);
    int main(){
    int n = 5, h = 10, tp = 2;
    double* w = (double*)malloc(n * sizeof(double));
    for (int i = 0; i < n; i++){
    w[i] = tp + h * i;
    }
    return 0;
    }


    double* T(int n, int h, int tp)
    {
       double* a = (double*)malloc(n * sizeof(double));

       for (int i = 0; i <   n; i++)
       {
          a[i] = tp + h * i;

       }
      return a;
       }

Поэтому, когда я хочу выполнить процесс заполнения массива "w" в основной функции, я получаю предупреждения:

1. Обнуление индикатора NULL "w"

и

2.Arithmeti c переполнение: использование оператора "+" для байтового значения 4, а затем проекция результата на байтовое значение 8. Перед вызовом оператора "+" сверните значение в более широкий тип, чтобы избежать переполнения (io.2).

НО, когда я пытаюсь выполнить внешнюю функцию, я получаю эти два предупреждения, но также:

3. Переполнение буфера при записи в элемент 'a': размер область записи 'n * sizeof (double)', но число записанных байтов может быть: '16'.

Мой вопрос: почему существуют различия между предупреждениями для одного и того же рабочего алгоритма, но выполняемого внутри и вне т он основная функция? Что означают предупреждения 1 и 2, и особенно, как устранить предупреждение 3 ?? Этот код был написан в C и работал в Visual Studio.

...