2014-02-06 3 views
-2

Здесь мой код..it дает ошибку ошибки сегментации ... скажите, пожалуйста, почему ... В этой небольшой программе я беру одну функцию add() и одну переменную int add. и внутри основной функции я создаю указатель на функцию add() и пытаюсь напечатать значение переменной add. Но это дает ошибку ... PLZ сказать мне, почему ??нельзя ли использовать имя переменной как функцию?

#include<stdio.h> 
float add(int , float); 
int main() 
{ 
     float (*fp)(int , float); 
     float result; 
     int add=10; 
     fp = add; 
     result = fp(5 , 9.9); 
     printf("%f\n",result); 
     printf("%d\n",add); 
     return 0; 

} 

float add(int a ,float b) 
{ 
     return a + b; 
} 
+0

'Fp = добавить,' что? – moeCake

+0

Почему вы не можете написать: 'fp = add; int add = 10; ', то есть назначить функцию указателю перед объявлением переменной' add'. –

+1

Я думаю, что вы должны уважать броузеры, накладывающийся на вас. Когда вы назначаете 'fp = add', любой разумный компилятор выдает предупреждение о несовместимых назначениях – Deepthought

ответ

3

Глобальные имена shadowed местными именами.

Итак, когда вы упоминаете add в main, он всегда будет пытаться взять add, объявленный в main первой.

Когда вы даете fp = add, вы назначаете целое число (int add = 10) указателю функции. и пытается позвонить по адресу. Это недопустимый адрес (10), поэтому вы получили ошибку сегментации.

+0

Спасибо ... я получил его. – user3197707

4

No.

Имена функций можно рассматривать как глобальные постоянные указатели на функции, в основном.

Ваш

int add = 10; 

shadows определение функции add(), в результате чего указатель функции должен быть установлен в 10 истолковано как функцию указателя, что плохо.

2

Код, который вы написали, не имеет ожидаемого эффекта. Когда вы объявляете переменную int add, она затеняет функцию. После этого этот код fp=add фактически присваивает указателю функции значение целочисленной переменной add. Затем, когда вы вызываете функцию, на которую указывает fp, вы получаете доступ к некоторому странному адресу (nameley 10) и получаете ошибку сегментации.

+0

Хорошее объяснение –

0

Функция add() глобальная переменная и int add - это локальная переменная, когда вы пытаетесь назначить добавление указателю, область действия локальной переменной преобладает над глобальным.

Попытайтесь прочитать предупреждение, что это скажет что-то вроде несоответствия типа для этого.

Если вы используете тип GCC gcc -Wall programname.c

Смежные вопросы