C 语言中指针作为函数参数的一个问题?

simowce
  • 109

在下面的代码中:

#include <stdio.h>

int *foo(int *pp)
{
    int ppp = 2333;

    pp = &ppp;

    return pp;
}

int main(void)
{
    int *p = NULL;
    int num = 520;

    p = &num;
    foo(p);

    return 0;
}

编译成汇编代码是这样的:

foo:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    $2333, -8(%ebp)
    leal    -8(%ebp), %eax
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   foo, .-foo
    .globl  main
    .type   main, @function
main:
.LFB1:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $20, %esp
    movl    $0, -4(%ebp)
    movl    $520, -8(%ebp)
    leal    -8(%ebp), %eax
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    foo
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret

在这里,pp 的访问都是通过 -4(%ebp) 来进行的,但是, pp 作为一个参数,不是应该是在 +8(%ebp) 吗?

然后是另外一段代码:

#include <stdio.h>

void foo(int *pp)
{
    int *ppp;

    ppp = pp;
}

int main(void)
{
    int *p = NULL;
    int num = 520;

    p = &num;
    foo(p);
}

编译成汇编代码是这样的:

    .file   "jjda2.c"
    .text
    .globl  foo
    .type   foo, @function
foo:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    8(%ebp), %eax
    movl    %eax, -4(%ebp)
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   foo, .-foo
    .globl  main
    .type   main, @function
main:
.LFB1:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $20, %esp
    movl    $0, -4(%ebp)
    movl    $520, -8(%ebp)
    leal    -8(%ebp), %eax
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    foo
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE1:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

然后这里面对 pp 的访问就是 +8(%ebp) 了。

为什么同样是一个参数,访问会有如此大的不同呢?

谢谢大家!

回复
阅读 3.5k
2 个回答

可能是编译器优化做的处理。

函数的返回值 和函数体内部的操作不一样!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏