Пытаетесь понять, что на самом деле представляет собой указатель на функцию? Это адрес в сегменте кода, где находится функция?
Например: этот фрагмент кода:
#include <stdio.h>
void foo(void)
{
}
int main(void)
{
int a = 10;
printf("a's address: %p\n", &a);
printf("foo's address: %p\n", foo);
return 0;
}
... печатает это:
[sh/prog-exercises/adam]:./a.out
a's address: 0xbfffb414
foo's address: 0x8048430
Я думаю, я немного смущен тем, как именно стек / куча процесса соотносятся с сегментом данных / кодом ELF. Любые полезные указатели будут действительно приветствоваться. Кроме того, мой первый вопрос, так что будьте осторожны, я действительно пытаюсь научиться. Спасибо!
3 ответа
Это адрес точки входа функции - начало ее кода. Переменная a
находится в стеке, поэтому неудивительно, что ее адрес значительно отличается - стеку и коду назначаются разные области кода, которые могут быть довольно далеко друг от друга.
Это изображение из книги UNIX: Системное программирование должно прояснить ситуацию. .
Внизу диаграммы у вас есть текст вашей программы (младшие адреса). Как можно проверить из вашей программы. Вот где будет находиться foo ().
Следует иметь в виду, что ваш код не полностью соответствует стандартам. Если вы используете gcc -Wall -Wextra -pedantic -ansi, вы получите жалобу на строку, в которой вы печатаете указатель на функцию. Это связано с тем, что стандарт не гарантирует, что указатели функций могут быть преобразованы в указатели void. C разработан для работы на многих различных архитектурах, и если архитектура является архитектурой Гарварда (отдельная память для инструкций и данных), могут быть веские причины для того, чтобы сделать эти указатели разных размеров.
Я предполагаю, что на практике это вряд ли имеет значение, но хороший факт, о котором следует знать. Особенно, когда вы пытаетесь узнать интимные подробности C.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.