C 如何获取退出库函数的地址并将其分配给全局变量?

C 如何获取退出库函数的地址并将其分配给全局变量?,c,global-variables,shared-libraries,exit,C,Global Variables,Shared Libraries,Exit,我想得到exit库函数的地址,然后将这个地址分配给一个全局变量 //test3.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int fp = &exit; 5 6 int main(){ 7 printf("fp=%d\n",fp); 8 return 0; 9 } 当我在main函数中获取并将exit的地址分配给一个局部变量时,没有错误 //te

我想得到exit库函数的地址,然后将这个地址分配给一个全局变量

  //test3.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4   int fp = &exit;
  5 
  6 int main(){
  7   printf("fp=%d\n",fp);
  8   return 0;
  9 }
当我在main函数中获取并将exit的地址分配给一个局部变量时,没有错误

  //test4.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(){
  5   int fp = &exit;
  6   printf("fp=%d\n",fp);
  7   return 0;
  8 }

如何将退出地址分配给全局变量?

您应该使用正确的类型声明
fp
(即指向取
int
但不返回任何内容的函数的指针):


不确定您想用
printf
做什么。如果要打印地址,请使用
%p
而不是
%d

您应该使用正确的类型声明
fp
(即指向接受
int
且不返回任何内容的函数的指针):


不确定您想用
printf
做什么。如果要打印地址,请使用
%p
而不是
%d

也见,也见,谢谢。但是,如果我在main函数中将exit的地址分配给局部变量,则没有错误。是的,但是有一个大的警告应该引起您的注意:
初始化从指针生成整数,而不使用强制转换
我认为警告不是最重要的问题。我可以使用gcc选项来抑制此警告。当然可以抑制此警告,但这不是一个好主意。警告不是问题,而是解决方案提示。它会准确地告诉您出了什么问题:将指针指定给
int
。因此,解决方案是修复
int
变量的类型。我尝试使用void(*fp)(int)=&exit。已成功编译。但是为什么在全局范围内使用函数指针是正确的呢?出口地址似乎只有在链接后才能获得。谢谢。但是,如果我在main函数中将exit的地址分配给局部变量,则没有错误。是的,但是有一个大的警告应该引起您的注意:
初始化从指针生成整数,而不使用强制转换
我认为警告不是最重要的问题。我可以使用gcc选项来抑制此警告。当然可以抑制此警告,但这不是一个好主意。警告不是问题,而是解决方案提示。它会准确地告诉您出了什么问题:将指针指定给
int
。因此,解决方案是修复
int
变量的类型。我尝试使用void(*fp)(int)=&exit。已成功编译。但是为什么在全局范围内使用函数指针是正确的呢?似乎只有链接后才能获得出口地址。
  //test4.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(){
  5   int fp = &exit;
  6   printf("fp=%d\n",fp);
  7   return 0;
  8 }
$ gcc -o test4 test4.c
test4.c: In function ‘main’:
test4.c:5:12: warning: initialization makes integer from pointer without a cast [enabled by default]
$ ./test4
fp=4195408
void (*fp)(int) = &exit;