Что представляет значение указателя указателя функции?

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

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

#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. Любые полезные указатели будут действительно приветствоваться. Кроме того, мой первый вопрос, поэтому, пожалуйста, будьте нежны, я действительно пытаюсь учиться. Спасибо!


person helpmelearn    schedule 14.10.2010    source источник


Ответы (3)


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

person sharptooth    schedule 14.10.2010
comment
Итак, вывод здесь представляет собой место, где эта конкретная функция была загружена как часть сегмента кода? Есть ли способ для программы C распечатать сегмент данных, начальный/конечный адреса сегмента кода? - person helpmelearn; 14.10.2010
comment
@helpmelearn: Да, это адрес, по которому находится запуск функции. Я не знаю решения для поиска адресов сегментов, и я полагаю, что это будет зависеть от реализации. Возможно, есть какая-то утилита, которая может сделать это для любого процесса. - person sharptooth; 14.10.2010

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

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

альтернативный текст

person Srikar Appalaraju    schedule 14.10.2010

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

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

person kasterma    schedule 27.10.2010