函数在C里面可以认为是指针, 但是又有特殊的一面.
如 调用 函数test 时, *test, test, &test 可以相互通用. 因为它们都指向同一个地址.
如 :
结果 :
指针的加减运算得到另一个内存地址. 具体结果是加几个字节和指针指向什么类型的数据有关. 如指向int, 那么加1相当于加4字节.
[root@db-172-16-3-150 zzz]# cat a.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef unsigned char byte;
int test1() {
fprintf(stdout, "this is test function.\n");
return 0;
}
void test2() {}
int main() {
size_t loadsize;
loadsize = (size_t) (*test1) - (size_t) (*test2);
byte a[loadsize];
fprintf(stdout, "test1:%p, test2:%p\n", test1, test2);
fprintf(stdout, "test1:%p, *test1:%p, &test1:%p\n", test1, *test1, &test1);
fprintf(stdout, "loadsize:%lu, a:%lu\n", loadsize, sizeof(a));
fprintf(stdout, "sizeof(test1):%lu\n", sizeof(test1));
memset(a, 0, sizeof(a));
memcpy(a, test1, loadsize);
int (*pfnFunction)();
pfnFunction = (int (*)())(a);
test1();
// pfnFunction(); // Segmentation fault
return 0;
}
结果 :
[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./a.c -o a && ./a
test1:0x4005d0, test2:0x4005c0
test1:0x4005d0, *test1:0x4005d0, &test1:0x4005d0 // 这三个值相等.
loadsize:16, a:16
sizeof(test1):1
指针的加减运算得到另一个内存地址. 具体结果是加几个字节和指针指向什么类型的数据有关. 如指向int, 那么加1相当于加4字节.
那么能不能用函数指针加1得到下一个地址呢? 从下面的测试来看, 函数指针加1等于加1字节. 可能因为函数代码段是变长的, 编译器没法得到函数代码段的具体大小. sizeof(函数)得到结果1.
上面这个例子是把tese1这个函数的代码段内容拷贝到
pfnFunction 数组, 但是显然有问题, 在调用的时候报错 Segmentation fault .