首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变更代码流

变更代码流
EN

Stack Overflow用户
提问于 2017-04-08 05:08:46
回答 2查看 189关注 0票数 0

我正试图改变这个程序的流程。我要它调用胜利函数。这不是确切的代码,但这将解释代码的作用。

代码语言:javascript
复制
void win() {
    printf("Code Flow Changed\n");
}

int main() {
    char input[10];
    scanf("%10s",input);
    void (*function)() = (void (*)())input;
    function();
    return 0;
}

win函数的地址是0x0a245101。

当我试图更改它时,每次我最终更改的是p/x $eax值而不是x $eax。有人能解释x $eax和p/x $eax显示的是什么吗?

代码语言:javascript
复制
(gdb) x $eax
0xf7ffb000: 0x0a245101
(gdb) p/x $eax
$2 = 0xf7ffb000

编辑:也请解释这是什么意思。

代码语言:javascript
复制
void (*function)() = (void (*)())input;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-08 05:13:40

p/x $eax向您显示当前在eax中的值。

x $eax不仅显示当前在eax中的值,而且显示eax值的地址中的值。

对不起,我的英语很差,希望你能理解.

实际上,它可能有一个更好的答案here

void (*function)()代表一个函数指针,它可以指向不接受参数并返回void的函数。

(void (*)())input的意思是将input转换成一个不接受参数并返回void的函数。

void (*function)() = (void (*)())input;的意思是使用函数指针指向input的地址,为什么?因为您告诉编译器input已转换为函数。

票数 0
EN

Stack Overflow用户

发布于 2017-04-08 05:48:24

Address是一个整数值,而不是char数组。你应该做以下几点:

代码语言:javascript
复制
void win() {
    printf("Code Flow Changed\n");
}

int main() {
    void *input = 0;
    printf("%p\n", win); // print the address of win
    scanf("%p",&input);  // re-type the address of win
    void (*function)() = (void (*)())input;
    function();
    return 0;
}

我的机器上的输出:

代码语言:javascript
复制
0x109d24ef0
0x109d24ef0
Code Flow Changed
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43290413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档