Какой вариант правильный? Его C упоминается в источнике, на который я ссылался. Но я чувствую его d - PullRequest
1 голос
/ 27 мая 2020

Рассмотрим следующие три функции C:

[P1]

int *g(void) {
    int x = 10;
    return (&x);
}

[P2]

int *g(void) {
    int *px;
    *px = 10;
    return px;
}

[P3]

int *g(void) {
    int *px;
    px = (int *)malloc(sizeof(int));
    *px = 10;
    return px;
}

Какая из трех вышеупомянутых функций может вызвать проблемы с указателями?

a. Только П3
б. Только P1 и P3
c. Только P1 и P2
d. P1, P2 и P3

Я считаю, что это должно быть d , потому что, если куча заполнена, malloc вернет нулевой указатель, а P3 может даже выйти из строя. Но тогда везде, где я вижу на Inte rnet, везде упоминается опция c. Хотелось бы услышать все ваше мнение по этому поводу!

1 Ответ

3 голосов
/ 27 мая 2020

Учитывая, что вопрос задает, что вероятно, вызовет проблемы, правильным ответом будет c) P1 и P2.

P1 возвращает адрес локальной переменной. Если этот адрес разыменован (или даже прочитан), он вызывает неопределенное поведение .

P2 разыменовывает неинициализированный указатель, что снова является неопределенным поведением.

P3 выделяет память с malloc, сохраняет значение в этой ячейке памяти и возвращает указатель на выделенную память. Хотя это правда, что это может вызвать проблему в случае отказа malloc, это менее вероятно, чем явное неопределенное поведение.

...