函数指针类型转换

3
我尝试了以下代码:

int TestMethod(int a, int b)
{
    printf("In TestMethod %d, %d \r\n", a, b);
    return 0;
}


int main(void)
{

    void (*ap_cb_function)() = (void(*)())TestMethod;
    ap_cb_function();

    return 0;
}

使用gcc编译器可以很好地运行。这会输出a和b的随机值。它是如何工作的?我原本期望在该行出现错误:

void (*ap_cb_function)() = (void(*)())TestMethod;

使用gcc编译器可以很好地运行。编译器并不是在运行您的程序;它只是为您明确告诉它要做什么而生成代码,无论这有多糟糕。如果您愿意,您可以将其转换为int* p并写入*p = 1;,行为也会是一样未定义的。 - WhozCraig
我已经在 ideone 上尝试过了,也成功运行。 - phuclv
1个回答

2

根据您的平台ABI,函数参数可以通过寄存器或堆栈传递。如果您没有指定参数,则从被调用函数的角度来看,一些随机值(在寄存器或堆栈上)仍然存在...


同时,这些参数在返回时会被错误地弹出。 - Eitan T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接