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