Передача по ссылке должна иметь начальное значение?

#c #arguments #pass-by-reference

#c #аргументы #передача по ссылке

Вопрос:

Когда аргумент функции передается по ссылке, должен ли аргумент the иметь начальное значение? я написал небольшую функцию, которая принимает uin64_t по ссылке, но она разбилась, когда я это сделал uint64_t a; func(VAL, a);\ VAL is definitely defined

функция просто выдает a новое значение, поэтому проблем с неопределенными значениями возникнуть не должно

Комментарии:

1. Вы, возможно, компилировали в режиме отладки?

2. Тот факт, что вы написали int a; , означает, что он был инициализирован в стеке с помощью конструктора без параметров по умолчанию, ему просто не было присвоено явное значение. Проблема в чем-то другом. Опубликуйте код, и, возможно, я смогу помочь.

3. @Vinnyq12: Что вы имеете в виду под has been initialized on the stack with the default parameterless constructor ? У примитивных типов нет конструктора!

4. И если бы у них были конструкторы, то конструктор без параметров предположительно инициализировался бы нулем, поскольку int i = int(); приводит к i == 0 .

Ответ №1:

Это зависит от того, что делает ваша функция. Если он пытается прочитать значение в параметре, вы получаете неопределенное поведение. Если вы просто присваиваете параметру, все в порядке:

 void func(int amp; var) {
    var = 5; // fine
}

void func(int amp; var) {
    std::cout << var << std::endl; // not fine
}
  

Комментарии:

1. func похожа на первую функцию

2. и все же он разбился. сбой прекратился только тогда, когда я сделал uint64_t a = 0; сначала

3. @calc: Если у вас произошел конкретный сбой, пожалуйста, покажите нам конкретный код, который вызывает сбой.

4. серьезный вопрос — хотя значение не определено, переменной присвоено значение. почему это проблема? (Извините, я сравниваю это с тем, как C это делает, поэтому мой вопрос)

5. @KevinDTimm : Хотя, возможно, это ничего не взорвало, по вашему опыту, это не значит, что это не может … ‘Undefined’ означает ‘неопределенный’, вам просто повезло.

Ответ №2:

Ничего общего со ссылками — использование неинициализированных переменных обычно приводит к неопределенному или, по крайней мере, нежелательному поведению. Однако, что-то вроде этого нормально:

 void f( int amp; x ) {
  x = 42;
}

int main() {
    int a;
    f( a );
}
  

Ответ №3:

Чтение неинициализированных переменных вызывает неопределенное поведение.

Ответ №4:

Ответ на ваш вопрос — нет. Причина сбоя вашего приложения, вероятно, в том, что a не инициализирован. Вот почему важно всегда инициализировать переменные.