C语言以数组和结构体传参

本文探讨C语言在32位和64位机器上如何通过栈和寄存器进行函数参数传递,特别是当涉及到数组和结构体时的处理方式。虽然C语言对函数参数数量没有明确限制,但过多参数会影响执行效率。通过实例分析了数组和结构体作为参数时的内存占用和传递机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言函数调用时的传参操作在32位x86机器上依赖栈进行.而在x86_64的机器上使用了部分寄存器作为辅助,但如果参数过多,寄存器不够使用,此时也必须借助于栈操作实现传参.尽管C语言对函数传递参数的个数没有明确限制(依编译器实现而定:http://stackoverflow.com/questions/9034787/function-parameters-max-number),但过多的参数传递势必影响代码执行效率.

通常C语言函数传参是非常明确的,如下面这个函数:

int test(int a,float b,int *pointer);
注:以下例子均使用32位x86,gcc编译器说明.

但如果把数组或结构体作为参数传递呢?到底传递了多少参数,占用了多少栈空间?

typedef struct list{
    int a;
    int b;
    int c;
    int d;
    int e;
}list;
int test1(int array[5]);
int test2(list listtest);

先看数组的例子:
/*passing arguments test:array*/
#include<stdio.h>
void array(int tmp[5]){
        printf("%d\n",tmp[2]);
}
int main(void){
        int test[]={1,2,3,4,5};
        array(test);
}
编译成汇编代码,先截取main函数传参部分:
        movl    $1, -32(%ebp)
        movl    $2, -28(%e
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值