вызов функции, приведение аргумента void * к любому другому типу - PullRequest
2 голосов
/ 05 ноября 2019

возникает вопрос о переполнении стека Зачем вводить пустой указатель? Я хочу задать соответствующий вопрос в комментарии, но я не разрешаю, поскольку я новичок здесь. Мой вопрос во втором ответе, данном Гийомом, есть эта функция.

void some_function(void * some_param) {
    int some_value = *((int *) some_param); /* ok */

Могу ли я сделать это так

// function defination

void some_function(void * some_param) {
    int some_value = *some_param;

// calling function, casting in argument

some_function((int *) some_param);

Спасибо

1 Ответ

2 голосов
/ 05 ноября 2019

В этом вызове

some_function((int *) some_param);

аргумент функции неявно преобразуется в тип параметра, равный void *. Таким образом, приведение является избыточным, и это утверждение в функции

int some_value = *some_param;

является недопустимым.

В соответствии со стандартом C (6.3.2.2 void)

1(Несуществующее) значение выражения void (выражение, имеющее тип void) не должно использоваться никаким образом, и неявные или явные преобразования (кроме void) не должны применяться к такому выражению. Если выражение любого другого типа оценивается как пустое выражение, его значение или обозначение отбрасывается . (Выражение void оценивается для его побочных эффектов.)

И это выражение

*some_param

имеет тип void в функции

void some_function(void * some_param) {
    int some_value = *some_param;
    //...
}

Asдля вопроса

Можно ли при вызове функции привести ее аргумент void * к любому другому типу в ANSI C

Вы можете назначить указатель типа void *указатель на объект любого другого типа без приведения или вы можете привести указатель типа void * к любому типу указателя объекта ..

...