#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)
определенно не правильный ответ. Это просто размер указателя на функцию.