c - 在 C 中以下列方式初始化 struct 有什么区别?
问题描述
我正在学习 C. 我有一个如下所示的结构。我看到了 2 种不同的初始化结构变量的方法。如果有人能解释这两种方式之间的区别以及在这种情况下哪种方式更受欢迎,那就太好了。
typedef struct {
int length;
int* elements;
} Array;
Array create_array_type_one(int size) {
Array result;
result.length = 0;
result.elements = (int *)malloc(size * sizeof(int));
return result;
}
Array* create_array_type_two(int size) {
Array *array = (Array *) malloc(sizeof(Array));
array->length = 0;
array->elements = (int *) malloc(sizeof(int) * size);
return array;
}
解决方案
所以,我们在这里谈论结构和功能。
基本上,调用者和被调用的结构函数可以通过三种方法相互通信。
- 将结构的每个成员作为函数调用的实际参数传递,或返回每个成员类型。
- 将结构的副本发送到整个被调用函数或返回结构类型(按值调用)。
- 使用指针,将结构作为参数传递并间接处理原始结构或返回结构的地址(通过引用调用)。
你的,案例1:
Array create_array_type_one(int size) {
Array result;
result.length = 0;
result.elements = (int *)malloc(size * sizeof(int));
return result;
}
在这种情况下,您是returning
调用函数的整个结构的副本。因此,为了在您的main()
函数中使用它,您应该执行以下操作:
Array new;
new = create_array_type_one(5);
在这里,您将返回的 type 结构分配给 typeArray
的结构Array
。
在案例 2 中:
Array* create_array_type_two(int size) {
Array *array = (Array *) malloc(sizeof(Array));
array->length = 0;
array->elements = (int *) malloc(sizeof(int) * size);
return array;
}
在这种情况下,您正在使用指针并返回指向新创建的 type 数据结构的指针Array
。您不是将结构的副本发送给调用函数,而是将其地址发送给调用函数。main()
因此,在while 调用中发生的情况是:
Array *ptr;
ptr = create_array_type_two(5);
这两种情况都有各自的优点和缺点,例如 CASE 1 确保数据安全,因为被调用函数完成的所有工作都发生在副本上,但使用额外的内存。与以前的方法相比,CASE 2 更高效、更快,因为它使用相同的内存位置进行操作。
推荐阅读
- dart - 使用 PageView 预加载网络图像
- android - Android加载大图像进行打印
- blockly - 在 Blockly Web 中存储和检索文件
- python - 计算重复列表值之间间隔的快速/Pythonic方法
- ios - 在 Swift 4 中使用 @objc 已弃用,但该怎么办?
- powershell - Powershell从不同域中的用户删除特定组列表
- excel - 如何在 Excel 2010 中添加 2 个或多个条件,如 Excel 2003
- android - 将 2 arraylist 与 SharedPref UserId 进行比较
- android-intent - 通过 Intent 共享文本在 Whatsapp 上被截断
- c - 我想我以错误的方式声明和使用数组