Tag: 函数 指针

你可以将“指向函数指针的指针”转换为void *

灵感来自对我的回答的评论。 这一系列步骤在C标准(C11)中是否合法? 创建一个函数指针数组 获取指向第一个条目的指针并将该指针转换为函数指针 void* 对该void*执行指针算术void* 将其强制转换为指向函数指针的指针并取消引用它。 或者相当于代码: void foo(void) { … } void bar(void) { … } typedef void (*voidfunc)(void); voidfunc array[] = {foo, bar}; // Step 1 void *ptr1 = array; // Step 2 void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3 voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4 我认为这是允许的,因为实际的函数指针只能通过正确的类型指针访问。 但Andrew Henle指出, […]

如果我转换函数指针,改变参数的数量会发生什么

我刚刚开始围绕C中的函数指针。要了解函数指针的转换是如何工作的,我编写了以下程序。 它基本上创建了一个函数指针,该函数指向一个带有一个参数的函数,将它转换为带有三个参数的函数指针,并调用该函数,提供三个参数。 我很好奇会发生什么: #include int square(int val){ return val*val; } void printit(void* ptr){ int (*fptr)(int,int,int) = (int (*)(int,int,int)) (ptr); printf(“Call function with parameters 2,4,8.\n”); printf(“Result: %d\n”, fptr(2,4,8)); } int main(void) { printit(square); return 0; } 这编译并运行时没有错误或警告(在Linux / x86上为gcc -Wall)。 我系统的输出是: Call function with parameters 2,4,8. Result: 4 显然,多余的论点只是默默地被抛弃了。 现在我想了解这里真正发生的事情。 至于合法性:如果我理解正确地将函数指针强制转换为另一种类型的答案,那么这只是未定义的行为。 因此,运行并产生合理结果的事实只是纯粹的运气,对吗? (或编译器编写者的好看) 为什么gcc不会警告我这个,即使是Wall? 这是编译器无法检测到的东西吗? 为什么? […]

在内存中执行机器代码

我正在试图弄清楚如何执行存储在内存中的机器代码。 我有以下代码: #include #include int main(int argc, char* argv[]) { FILE* f = fopen(argv[1], “rb”); fseek(f, 0, SEEK_END); unsigned int len = ftell(f); fseek(f, 0, SEEK_SET); char* bin = (char*)malloc(len); fread(bin, 1, len, f); fclose(f); return ((int (*)(int, char *)) bin)(argc-1, argv[1]); } 上面的代码在GCC中编译得很好,但是当我尝试从命令行执行程序时,如下所示: ./my_prog /bin/echo hello 程序段错误。 我已经发现问题出在最后一行,因为评论它会阻止段错误。 我不认为我做得很对,因为我仍然在考虑function指针。 这个问题是错误的演员,还是其他什么?