Что представляет собой значение указателя на указатель функции? - PullRequest
7 голосов
/ 14 октября 2010

Пытаетесь понять, что на самом деле представляет указатель на функцию?Это адрес в сегменте кода, где находится функция?

Например: этот фрагмент кода:

#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 ]

5 голосов
/ 14 октября 2010

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

3 голосов
/ 14 октября 2010

Это изображение из книги UNIX: Системное программирование должно прояснить ситуацию.

В нижней части диаграммы у вас есть текст вашей программы (низкие адреса). Как можно проверить из вашей программы. Вот где будет находиться foo ().

alt text

2 голосов
/ 28 октября 2010

Следует иметь в виду, что ваш код не полностью соответствует стандартам.Если вы используете gcc -Wall -Wextra -pedantic -ansi, вы получите жалобу на строку, где вы печатаете указатель функции.Это связано с тем, что стандарт не гарантирует, что указатели функций могут быть преобразованы в указатели void.C предназначен для работы на многих различных архитектурах, и, если архитектура представляет собой архитектуру Гарварда (отдельная инструкция и память данных), могут быть веские причины для создания этих указателей разных размеров.

Я полагаю, что на практике этовряд ли имеет значение, но хороший фактоид, о котором следует знать.Esp, когда вы пытаетесь узнать интимные детали C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...