在结构中为Char *分配值,哪个解决方案是可取的c ++

时间:2014-11-27 13:00:30

标签: c++ c struct char

让我说我有一个充满字符指针的结构。哪个是使用从函数返回的字符串初始化值的正确方法

typedef struct details{
char *name;
char *address;
char *nickname;
}details_t

string function() 
{
string name = "random string calculation";
return string;
}

情形1:

直接指定返回值。这里我不明白string_1.c_str()的结果存储在哪里。它是否在堆中,因为它是字符串类?

main()
{
details_t details_t1;
details_t1.name = function().c_str();
details_t1.address = function().c_tr();

function_2(details_t1);
}

案例2: 在堆中分配内存

main()
{
details_t details_t1;
details_t1.name = (char*)malloc(string_1.size()+1);
strcpy(details_t1.name,string_1.c_str();
....

function_2(details_t1);
}

2 个答案:

答案 0 :(得分:2)

两种情况都是错误的:

  1. 存储c_str返回的指针。该指针的生命周期由返回它的字符串控制,因此它独立于details_t结构。您可能会引用内存区域不再有效,例如你将向字符串追加一些内容,它会重新分配它的内部缓冲区,你的结构仍将指向旧的缓冲区。

  2. 您正在使用malloc分配内存(在C ++中几乎总是错误的)并将此内存分配给结构的成员。这在技术上并不正确,但这不是在C ++中完成的事情。将结构成员分配给具有未知所有者的已分配内存是否为

  3. 您应该忘记在结构中使用char*,只使用std::string

答案 1 :(得分:1)

c_str()string类当前具有字符的地方 - 它可能在堆上,它可能使用小字符串优化。如果字符串得到更新,它可能会改变,因为C ++字符串不是不可变的。它可能超出范围。 不要使用选项1。

选项2更安全。然后,您在结构中拥有自己的副本。 但是,不要忘记随后释放内存。 如果你可以做C ++,使用析构函数来整理。 然后考虑复制构造函数等(规则3或5)。

选项3可能更好: 考虑只在内部设置std::string。 (规则为0)