C 语言中指针作为函数参数的一个问题?-问答-阿里云开发者社区-阿里云

开发者社区> a123456678> 正文

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

2016-06-22 10:21:20 2277 1

在下面的代码中:

#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) 了。

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

谢谢大家!

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:45:16

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

    0 0
相关问答

48

回答

云计算自助服务开篇

阿里云支持与服务 2012-12-18 12:00:13 75848浏览量 回答数 48

19

回答

在阿里云ECS云服务器里安装Ubuntu 17.10官方系统

dongshan8 2018-04-26 07:12:15 69364浏览量 回答数 19

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 223058浏览量 回答数 162

51

回答

ossfs工具发布啦,让传统软件和云端存储完美融合

scorpion 2015-12-08 09:18:56 69734浏览量 回答数 51

294

回答

Linux Bash严重漏洞修复紧急通知(已全部给出最终修复方案)

qilu 2014-09-25 13:26:50 431650浏览量 回答数 294

53

回答

巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力!

qilu 2013-05-29 22:24:22 62851浏览量 回答数 53

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 302651浏览量 回答数 249

62

回答

磁盘原地扩容功能4月22日正式上线

艳馨 2015-04-21 23:40:33 96109浏览量 回答数 62

27

回答

阿里云开源软件镜像站点上线啦!!

qilu 2014-01-06 18:14:06 95762浏览量 回答数 27

35

回答

ECS云服务器系统内部导致问题解决方案【持续连载】

qilu 2014-04-24 20:16:43 94393浏览量 回答数 35
+关注
0
文章
14879
问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载