2015-11-07 5 views
2

Lauguage: C++Параметр по умолчанию для массива C++ при перегрузке функции

Мне нужно сделать функцию «add» перегруженной.

Функция «добавить» имеет массив a [] в качестве параметра.

Я написал свой код, но он не работает.

Приведенные ниже действия не допускаются и не принимаются к оплате.

В чем проблема с кодом?

int add(int a[], int n, int b[]) 
{ 
    int sum = 0; 
    for (int i = 0; i < n; i++) 
     sum += (a[i] + b[i]); 
    return sum; 
} 

int add(int a[], int n=5) 
{ 
    return add(a, n, NULL); 
} 
+1

«Это не начинается», безусловно, является неправильной интерпретацией событий. –

+0

Указывает ли назначение, что 'a []' является параметром массива? Это вводит в заблуждение, потому что это действительно указатель. Массивы не являются указателями, и хорошо понять, что на раннем этапе. – juanchopanza

+0

Что, по-вашему, проходит через 'NULL'? Подсказка: это не массив нулей. – JorenHeit

ответ

1

При объявлении аргументов как массив в том, как вы делаете (например, int a[]), то компилятор фактически декларирует аргумент будет указателем.

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

Не обращайтесь к b, если это нулевой указатель.


int add(int* a, int n, int* b) 
{ 
    int sum = 0; 
    for (int i = 0; i < n; i++) 
    { 
     if (b == nullptr) 
      sum += a[i]; 
     else 
      sum += a[i] + b[i]; 
    } 
    return sum; 
} 
+0

Ум .. вы имеете в виду, что мне нужно удалить NULL в return add (a, n, NULL). Затем, как я могу присвоить значение NULL или 0 значение b [], если нет третьего параметра? –

+0

@HoSuk Нет, я имею в виду, что вам нужно добавить 'if (b == nullptr)' проверку функции. –

+0

'INT добавить (Int А [], Int N, Int Ь []) { \t, если (б == nullptr) \t \t для (INT I = 0; <п; я ++) \t \t \t б [i] = 0; \t int sum = 0; \t для (int i = 0; i

1
sum += (a[i] + b[i]); 

индексы b, которые могут быть NULL. Это неопределенное поведение.

Хороший способ избежать этой ловушки - использовать std::vector.

 Смежные вопросы

  • Нет связанных вопросов^_^