面试题答案
一键面试#include <stdio.h>
// 定义结构体
typedef struct {
int num;
float f;
char str[20];
} MyStruct;
// 定义函数,以结构体值传递的方式接收结构体
void printStruct(MyStruct s) {
printf("num: %d\n", s.num);
printf("f: %f\n", s.f);
printf("str: %s\n", s.str);
}
int main() {
MyStruct myStruct = {10, 3.14f, "Hello"};
printStruct(myStruct);
return 0;
}
参数开销分析
- 栈空间占用:在函数调用时,值传递方式会将实参结构体的所有成员的值复制到函数栈帧中,为形参分配内存空间。由于结构体包含多个不同类型成员,需要占用一定大小的栈空间。例如,上述结构体中
int
类型通常占4字节,float
类型占4字节,char
数组最多占20字节,总共28字节(假设32位系统)。 - 时间开销:值传递过程中需要进行数据的复制操作,将实参结构体的每个成员的值逐位复制到形参结构体对应的成员中,这会花费一定的时间,尤其是当结构体成员较多或结构体本身较大时。
结构体非常大时的问题
- 栈溢出风险:如果结构体非常大,在函数调用时,值传递方式会在栈上分配大量空间用于形参结构体的复制。而栈空间是有限的,当分配的空间超过栈的容量时,就会导致栈溢出错误,程序崩溃。
- 性能问题:随着结构体变大,复制数据的时间开销会显著增加。每次函数调用都要进行大量数据的复制,这会严重影响程序的运行效率,特别是在频繁调用该函数的情况下。
因此,当结构体非常大时,一般建议使用指针传递或引用传递(在C++ 中有引用概念,C语言中可通过指针模拟)来减少参数传递的开销。