Tag: 函数指针

POSIX对C中指针类型的限制

背景 POSIX标准为C语言添加了许多库函数和其他标识符。 在dlsym()函数的描述中,它说(我强调): 概要 #include void *dlsym(void *restrict handle, const char *restrict name); 描述 dlsym ()函数应获取符号的地址( 函数标识符或数据对象标识符)… C标准不保证函数指针可以转换为void * ,甚至不能保证指针的大小相同。 这有效地增加了对C类型系统的额外限制。 题 我的问题是: 对于C类型系统的这种限制是否存在规范性参考,或者它是否只能从某些库函数的描述中推导出来? POSIX甚至可以在sizeof ( function pointer ) > sizeof (void *)吗? 参考 C11标准(最终公开草案): n1570 The Open Group的POSIX标准: POSIX.1-2008 POSIX dlsym()函数

将单指针和双指针传递给c 中的函数

我试图在函数中传递单个指针和双指针 。 但它给了我错误。 int main() { int *pt; fun(pt); . . } fun(int *pt) { pt=(int*)malloc(6*sizeof(int)); . . } 我们使用双指针时的语法是什么。 任何人都可以用一个例子来描述它,或者可以编辑上面的例子。 我将非常感谢你。

C:如何访问存储在void指针中的函数指针(void *)?

混淆了如何访问存储在void指针中的函数指针(void *)。 假设你有这个: void *functions[] = { &sqrt, // int ft_sqrt(int nb); &power, &logN, &factorial; }; // An array of void pointers, each storing a function pointer. 如果我想访问sqrt函数,我的猜测如下: (int (*)(int)) functions[0](x) 但我的猜测是错误的: error: called object type ‘void *’ is not a function or function pointer 那么如何访问其中一个函数呢?

可以使用函数指针来运行“数据”吗?

这不是大多数人可能会使用的东西,但它只是浮现在脑海中并且困扰着我。 是否可以使用c-string中的某些机器代码,然后将其地址转换为函数指针,然后使用它来运行该机器代码?

C中函数指针语法的用途是什么?

编辑:有人指出,这个问题有点令人困惑。 短版本是:“为什么有一个单独的指针变量(例如, fnPtr )指向一个函数(例如, fn )当函数名称fn本身,没有参数,已经是一个指针?/ EDIT 我正在尝试理解某些内容,并且可以使用来自社区的有关函数指针的反馈。 (虽然这可能看起来像是关于这个主题的其他问题的重复,但实际上并非如此,至少不是我能找到的。) 我理解指向函数的指针的概念被用作另一个函数的参数作为回调…即告诉fn1在执行fn1期间以某种方式使用fn2 。 我不明白的是所有这些都使用了复杂的语法。 如果fn是一个已定义的函数,则调用fn(…)将使用提供的参数执行该函数。 但是, fn本身使用的是函数的地址,即指向函数的指针。 此外, fn , &fn和*fn都是一样的。 为什么有专用的函数指针,以及为什么要创建指向函数的新变量(即fnPtr )…函数名称已经是它自己的指针! 此代码每次编译和工作相同。 #include #include int fn(int var) { //fn is a function which takes an int and returns an int return var; } int (*fnPtrAmp)(int) = &fn; int (*fnPtr)(int) = fn; int needsCallback(int variable, int […]

为什么解除引用主函数不显示内存内容?

我试图获取函数名[abc()和main()]指向的地址的内存内容,但函数内的printf()都给出了相同的输出,尽管我取消引用了函数名所指的地址。每个函数内部的第二个printf()。 这是为什么? 为什么内存地址由*(abc)和*(main)而不是内容打印? #include void abc(){ printf(“\n%p \n “, abc); printf(“\n%#x\n “,*(abc)); } void main(){ abc(); printf(“\n%p \n “, main); printf(“\n%#x\n “,*(main)); }

函数中的struct指针范围

如果我在函数中有以下内容: struct example *A=malloc(sizeof(struct example)); 节点/内存空间是否在函数结束/离开后A点指向被销毁? 还是它留在堆里?

函数中* p和(* p)之间有什么区别?

我是编程和学习C中数组指针的新手。看看下面的程序。 第一个节目 #include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf(“%d”,*(*(num+1)+1)); *(*(num+1)+1)=0; printf(“%d”,*(*(num+1)+1)); return 0; } int fun(int **p) { *(*(p+1)+1)=2135; return 0; } 第二个节目 #include int fun(); int main() { int num[3][3]={21,325,524,52,0,6514,61,33,85}; fun(num); printf(“%d”,*(*(num+1)+1)); *(*(num+1)+1)=0; printf(“%d”,*(*(num+1)+1)); return 0; } int fun(int *p) { *((p+1)+1)=2135; return 0; } 第3节目 #include int fun(); int main() […]

用于qsort函数指针的Typecast

#include #include #include #include static int cmpstringp(const void *p1, const void *p2) { /* The actual arguments to this function are “pointers to pointers to char”, but strcmp(3) arguments are “pointers to char”, hence the following cast plus dereference */ return strcmp(* (char * const *) p1, * (char * const *) p2); } int […]

C中的双重函数间接

我正在为ARM Cortex-M0 CPU编写一个bootloader。 我需要将IRQ转发到目标应用程序,遗憾的是,此CPU中的IRQ向量位于固定地址,我无法重新定位,所以我需要一些技巧。 我知道目标应用程序的IRQ的地址存储的地址。 所以,假设在地址0x5008处有void x_IRQHandler(void)的地址(目标app) 我想做的是: 在启动时保存所有x_IRQHandler()的地址(以便它不在运行时计算); 每当引导加载程序收到IRQ调用时,从其地址调用目标应用程序中的相关IRQ函数。 这是我在bootloader中所做的,我找不到合适的语法。 //pointers to x_IRQHandler() functions void(* x_IRQ_addr)(void); x_IRQ_addr = (void(*)(void))(0x5008); //here I should call the function pointed by x_IRQ_addr; but this syntax is not valid void x_IRQ_Handler(void) { *x_IRQ_addr(); } 我尝试了不同的方法但没有成功,我该如何解决?