Возвращает массив указателей на функции

#c #pointers

#c #указатели

Вопрос:

У меня есть два файла main.c и foo.c, я пытаюсь скопировать массив функций из одного файла в другой.

Моя проблема в том, что копируется только первый элемент.

Это мой код:

foo.c:

 void foo1();
void foo2();
void foo3();
void foo4();
void foo5();
void foo6();
void foo7();

void (*myFuncs[7])() = {
    foo1,
    foo2,
    foo3,
    foo4,
    foo5,
    foo6,
    foo7
};

void* getMyFuncs(){
    return myFuncs;
}
  

main.c:

 void (*things[7])();

void main(){
   memcpy(things, getMyFuncs(), sizeof(getMyFuncs()));
}
  

После запуска в режиме отладки я проверил свой массив, и скопировал только указатель foo1.

Итак, мой вывод имеет:

 void (*things[7])() = {
    foo1 (hex address here),
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00
};
  

Чего я ожидал:

 void (*things[7])() = {
    foo1 (hex address here),
    foo2 (hex address here),
    foo3 (hex address here),
    foo4 (hex address here),
    foo5 (hex address here),
    foo6 (hex address here),
    foo7 (hex address here)
};
  

Почему копируется только первый элемент?

Спасибо

Комментарии:

1. Потому что вы сказали memcpy копировать только один.

2. Альтернативно: потому что вы объявили getMyFuncs с неправильным типом, но тогда sizeof getMyFuncs() все равно неправильно.

3. Как так? Как я должен указать копировать все итены?

4. Каков результат sizeof(getMyFuncs()) ?

5. getMyFuncs возвращает указатель. Указатели знают только, на какой тип они указывают (и даже не это, для void * ). Даже если они указывают на первый элемент массива, они не знают, сколько элементов в массиве. sizeof(getMyFuncs()) == sizeof(void*) .

Ответ №1:

Я нашел решение, это была глупая ошибка!

Моя строка:

 memcpy(things, getMyFuncs(), sizeof(getMyFuncs()));
  

неверно, я не хочу копировать размер getMyFuncs() .

Способ записи для копирования — получить размер моего массива функций:

 memcpy(things, getMyFuncs(), sizeof(things));
  

Комментарии:

1. Пожалуйста, примите ваш ответ, если вы найдете его полезным :).

2. Действительно? Почему два дня?

3. Да, когда я нажимаю «Принять», появляется всплывающее сообщение «Вы можете принять свой собственный ответ через 2 дня»

4. Пожалуйста, посмотрите мое предлагаемое редактирование. sizeof(getMyFuncs) отличается от sizeof(getMyFuncs()) . Второе — это возвращаемое значение getMyFuncs .

5. @JL2210 sizeof(getMyFuncs) определенно не правильный ответ. Это просто размер указателя на функцию.