传递c++中保存静态数组的结构体
Passing structs holding static arrays in C++
我想知道是否可以在c++中传递/返回持有静态分配数组的结构体。例如:
typedef struct t{
char name[32];
int id;
}t;
t foo(char name[]){
t my_t = {name, 0};
return my_t;
}
int main(){
t main_t = foo("a struct");
printf("%s", main_t.name); //is this safe to access?
return 0;
}
当它按值返回结构体时,我猜它不会复制数组名称,只复制指向它的指针。
编辑:只是为了澄清一些事情。我知道在函数参数中char *var
等于char var[]
。我甚至没有测试就很快地编写了这段代码。我知道它绝对不是世界上最好的代码,我不建议任何人在现实生活中使用它。理想情况下,我会动态分配结构并传递指针,然而,我正在教一个人用C/c++编程。这是一个国家考试,不需要一个人知道动态分配或指针的事情,这就是为什么*
没有真正使用。
这个问题实际上是关于是否可以返回一个包含静态分配数组的结构体。
我们可以用这段代码代替吗?
#include <iostream>
struct t{
char name[32];
int id;
};
t foo(int id){
t my_t;
my_t.id = id;
for(char i = 0; i < 31; i++){
my_t.name[i] = 'a';
}
my_t.name[31] = ' ';
return my_t;
}
int main(){
t main_t = foo(0);
std::cout << main_t.name; //is this safe to access?
return 0;
}
可以的。
但不应该这样做:替代方案是std::string
和std::array
。你可以复制、分配、再分配等等。免费!
struct t {
std::string name;
int id;
std::array<int, 10> integers;
};
...
t main_t = {"a struct"};
main_t.integers[5] = 5;
t copy = main_t;
assert( copy.name == "a struct" );
assert( copy.id == 0 );
assert( copy.integers[5] == 5 );
-
你的代码中没有
static
数组 -
当您按值返回
t
实例时,它将复制数组的内容。 -
问题在于你如何初始化
t
实例,而不是与你如何返回它。
改变:
t my_t = {name,0};
:
t my_t = {0};
strncpy(my_t.name,name,sizeof(my_t.name)-1);
如果你想避免使用标准库函数,也可以这样:
int i;
t my_t;
for (i=0; i<sizeof(my_t.name)-1 && name[i]!=0; i++)
my_t.name[i] = name[i];
my_t.name[i] = 0;
my_t.id = 0;
程序出错;你试图复制一个指向数组的指针,而应该将指针指向的内容复制到数组中。应该是这样的
#include <algorithm>
#include <cstring>
struct t
{
char name[32];
int id;
};
t foo(const char *name)
{
t my_t = {};
const size_t len = std::strlen(name);
const size_t max_len = sizeof(t::name) / sizeof(t::name[0]) - 1u;
std::copy(name, name + std::min(len, max_len), my_t.name);
return my_t;
}
int main()
{
t main_t = foo("a struct");
printf("%s", main_t.name);
}
关于你的问题
我想知道是否可以在c++中传递/返回持有静态数组的结构
是的,没问题,整个结构体将被复制(或移动,取决于类型)到调用端的变量
可以传递包含数组的结构体。然而,这一行并不像你想象的那样:
t my_t = {name, 0};
使用指定初始化语法,它将相当于:
t my_t = { .name[0] = name; .name[1] = 0; };
t
的第一个成员是一个包含32个元素的数组,因此前32个初始化式应用于这32个char
。除非您使用更多的大括号,但每个元素仍然需要一个初始化式,否则没有神奇的方法可以从用大括号括起来的初始化式中获得strcpy
。
使用指针初始化char
时,会出现编译器错误。
相关文章:
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 如何使用函数的输出初始化 const 数组结构字段?
- 传递数组结构、ofstream 和 interger 以运行
- 从文本文件中读取并输入到数组结构中,然后显示读取的数据C++
- 将文本文件读取到数组结构中
- C/C++中数组结构和数组结构的通用接口
- C++ MDC final-在字符类型的数组结构中按字母顺序对记录中的名称进行排序
- C++ 使用数组结构创建平衡的二叉搜索树
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- 使用 vector 在 c++ 中声明 3D 数组结构
- 数组结构无法正确打印
- 如何在C++中访问数组结构内部的数组结构
- CIN进入数组结构似乎什么也没输入
- ifstream将数组结构到txt文件中,然后尽可能将其提取为数组
- wlanapi-将WlanFreeMemory释放其WLAN_INTERFACE_INFO数组结构
- 显示数组结构 c++
- C++ 使用函数访问数组结构的方法是什么?
- 将庞大的数组结构复制到 GPU
- 如何封送包含字符矩阵的数组结构
- c++动态数组结构体分割错误