Как вызвать функцию, не вызывая ее напрямую в c - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь вызвать функцию, вызвав ее напрямую. Итак, я использую указатели на функции и переполнение буфера. Я получаю то, что хочу, однако, когда я отлаживаю программу, я получаю ошибку сегментации.

Есть ли способ получить точный результат без ошибки сегментации?

#include <stdio.h>

 void hello()
 {
    printf("hello()!\n");
 }

 void first()
 {
   void  (*array[1])();
   array[8] = &hello;
   printf("you are first()!\n");
 }

  int main (int argc, char *argv[])
{
  first();
  return 0;
 }

Вывод, который я получаю;

ты первый ()!

привет (!)

Примечание: я использую Code: Blocks в качестве платформы и GDB / CDB в качестве отладчика

1 Ответ

0 голосов
/ 05 ноября 2018

Вы объявляете массив размером 1 и пытаетесь присвоить что-то его 9-му (индекс массивов начинается с 0) индекса. array[8] не было выделено здесь. Это причина ошибки сегментации. Чтобы избавиться от этого, вы должны присвоить hello индексу, который находится в пределах размера array. В вашем случае

void first()
{
    void  (*array[1])();
    array[0] = &hello;
    printf("you are first()!\n");
}

решит проблему. Над кодом будет напечатана функция hello()!. Для этого вам также следует вызвать функцию hello.

void first()
{
    void  (*array[1])();
    array[0] = &hello;
    printf("you are first()!\n");
    array[0]();
}
...