Что означает (int) при программировании C

StackOverflow https://stackoverflow.com/questions/1504901

  •  19-09-2019
  •  | 
  •  

Вопрос

void problem3(void) {
    int overflowme[16];
    int x = (int) problem3; // x is the address of the first instr for problem3
    printf("hello world\n");
    overflowme[17] = x; 

Мне интересно, что делает (int) в программировании C.

Это было полезно?

Решение

Это тип, и говорит компилятору «игнорировать тип, который на самом деле имеет проблема3, и разбирайтесь с ним так, как если бы он был напечатан как int».

В этом примере задача3 имеет тип указателя функции, поэтому обычно компилятор отклоняет программу (используя указатель функции, когда ожидается целое число, обычно является ошибкой программиста). Typecast вызывает другую интерпретацию - программист вмешивается и говорит: «Я знаю, что делаю».

Другие советы

Это явный актерский состав. Вы поднимаете значение проблемы 3 целочисленному целому числу, а затем назначаете это целочисленное значение x.

Обратите внимание, что на самом деле это не изменяет значение проблемы3.

Это актерский состав - это форма преобразования типа операнда (problem3 в вашем примере) к другому типу.

В C (и в C ++, когда используется актерский состав в стиле C), актерский состав может выполнить одну из нескольких вещей:

  • Ничего не делать, кроме как изменить тип чего -либо, не изменяя форму данных. Например, когда вы бросаете указатель на int.
  • Выполните преобразование как часть операции актеров. Например, при приостановке плавания в INT данные фактически преобразуются из формы, используемой для представления значений с плавающей запятой (обычно в форме показателя/мантиссы) в простое старое целое число (с любым потерянной частью потерянной части)

Поскольку различные формы кастинга могут быть запутанными или неясно, что происходит (или намеревается произойти), C ++ добавил несколько конкретных операторов кастинга:

  • reinterpret_cast<>() что соответствует первой форме, описанной выше
  • static_cast<>() что соответствует второй форме (даже если преобразование не приводит к изменению внутреннего формата данных)
  • const_cast<>() который является особым случаем кастинга, способного удалить const или же volatile квалификаторы, которые могут быть применены к объекту
  • dynamic_cast<>() который является совершенно новым для C ++ и не имеет аналогичной функциональности в C. Этот оператор используется для безопасного «понижения» типа базового объекта до одного из его производных типов.

Поскольку они по своей природе опасны, акции, как правило, считаются плохой формой. Когда вы выполняете операцию актера, вы подрываете способность компилятора выполнять проверку типов. Тем не менее, бывают случаи, когда это может быть необходимо или очень полезно, и вы увидите, что он часто используется в C -коде.

В вашем примере, problem3 является указателем на функцию, и актерский состав «преобразовывает» адрес для этой функции в int. Затем он хранит этот адрес как размышления в массиве, но на самом деле один элемент массива после конца массива (что является не-нет). На многих платформах, которые неверный элемент массива - это то, где хранится обратный адрес для функции, так что это произойдет, когда problem3() Функция возвращается, она вернется к себе и снова запустит (Ad -Infinitum - своего рода).

В конечном итоге он недооценит стек, потому что новый, взломать problem3() не будет вызовов функции, который помещает обратный адрес в стек - он просто разбит все, что было в стеке перед ним, и return Снова, повторяя процесс до тех пор, пока стек не поднимет потоки, что, вероятно, приведет к исключению процессора.

Как отметили другие, это просто явное состав. Это просто изменяет тип переменной в int тип.

Но из кода, который вы разместили, выглядит так, как будто эта функция готовится к какому -то переполнению буфера или что -то в этом роде. Какова остальная часть этой функции?

Это типичный т.е. т.е. Он преобразует переменную/постоянную, следуя по ней в указанный тип. Здесь тип void (*) (void) преобразуется в int (вещь в брекетах)

Это означает, что problem3 преобразуется в тип int, прежде чем назначать INT x

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top