Рубрики

Викторина С — 101 | Вопрос 4

#include "stdio.h" 

int main()

{

 void *pVoid;

 pVoid = (void*)0;

 printf("%lu",sizeof(pVoid));

 return 0;

}

Выберите лучшее утверждение для приведенного выше фрагмента программы на Си.
(A) Назначение (void *) 0 для pVoid неверно, поскольку память не была выделена. Вот почему нет ошибки компиляции, но это приведет к ошибке во время выполнения.
(B) Назначение (void *) 0 для pVoid не является правильным, поскольку жестко закодированное значение (здесь ноль, то есть 0) не может быть присвоено ни одному указателю. Вот почему это приведет к ошибке компиляции.
(C) Нет проблемы компиляции и не проблема времени выполнения. И размер указателя void, т.е. pVoid, будет равен размеру int.
(D) Оператор sizeof () не определен для указателя типа void.

Ответ: (с)
Объяснение: (void *) 0 — это в основном NULL-указатель, который используется для многих целей в C. Обратите внимание, что независимо от типа указателя, каждый указатель содержит некоторый адрес, а размер каждого указателя равен sizeof (int) , Так что D) не правильно. Абсолютному адресу можно присвоить любой указатель, хотя это может привести к проблемам во время выполнения, если адрес недопустим. Поскольку 0 является юридическим адресом, присвоение (void *) 0 pVoid — это хорошо. Так что Б) не правильно. Мы не делаем никаких незаконных операций с pVoid здесь. Так что это не приведет к ошибке компиляции / выполнения. Так что а) не правильно. Например, если мы выполним недопустимую операцию над pVoid, например, отменим ссылку на указатель void, т.е. * pVoid, это приведет к ошибке. Вышеуказанная программа скомпилируется / запустится без проблем. Так что в) это правильно.
Тест на этот вопрос

Рекомендуемые посты:

Викторина С — 101 | Вопрос 4

0.00 (0%) 0 votes