传递在C ++中保存静态数组的结构

时间:2014-05-02 11:18:20

标签: c++ arrays struct

我想知道是否可以传递/返回在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;
}

4 个答案:

答案 0 :(得分:2)

可以做到。

但它不应该完成:替代方案是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 :(得分:1)

  1. 代码中没有static数组。

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

  3. 问题在于您如何初始化t实例,以及如何退回。


  4. 改变这个:

    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的编译器错误。