传递c++中保存静态数组的结构体

Passing structs holding static arrays in C++

本文关键字:数组 结构体 静态 保存 c++ 传递      更新时间:2023-10-16

我想知道是否可以在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::stringstd::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. 你的代码中没有static数组

  2. 当您按值返回t实例时,它复制数组的内容。

  3. 问题在于你如何初始化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时,会出现编译器错误。