我想知道是否可以传递/返回在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;
}
当它按值返回struct时,我猜它不会复制数组名,只复制指向它的指针。
编辑:只是为了清理一些事情。我知道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] = '\0';
return my_t;
}
int main(){
t main_t = foo(0);
std::cout << main_t.name; //is this safe to access?
return 0;
}
答案 0 :(得分:2)
可以做到。
但它不应该完成:替代方案是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 );
答案 1 :(得分:1)
代码中没有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;
答案 2 :(得分: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 ++中保存静态数组的结构
是的,没关系,整个结构将被复制(或移动,取决于类型)到调用端的变量。
答案 3 :(得分:0)
传递包含数组的结构是可以的。但是,这一行不符合你的想法:
t my_t = {name, 0};
使用指定的初始化语法,它等同于:
t my_t = { .name[0] = name; .name[1] = 0; };
t
的第一个成员是一个包含32个元素的数组,因此前32个初始值设定项应用于这些32个char
。除非你使用更多的大括号,但你仍然需要每个元素一个初始化器,所以没有神奇的方法可以从大括号括起来的初始化器中获得strcpy
。
您应该收到有关使用指针初始化char
的编译器错误。