为指针赋值

时间:2011-05-12 17:05:12

标签: c++ pointers

如果a有一个指向对象的指针数组,那么填充数组的方式更清晰,(1)或(2),在下面的代码段中?是

string ** list = new string*[5];
string* s = new string("foo");
*list[0] = *s;  //(1)
list[0] = s;   //(2)

3 个答案:

答案 0 :(得分:3)

第一种方法会导致未定义的行为。 list[0]未指向有效的string对象,因此取消引用它并分配给它将会很糟糕。

第二种方法对我来说没问题(从某种意义上说它不会有未定义的行为),但我想这取决于你如何继续使用它。

答案 1 :(得分:0)

很难说没有看到你的其他程序,但这两个似乎错了。如果您正在寻找“干净”,请尝试以下任一方法:

string * list = new string[5];
list[0] = "foo";

vector<string> list(5);
list[0] = "foo";

这两者都(主观地)比你的任何一个更干净。

答案 2 :(得分:0)

(1)是一个错误,因为list [0]最初是NULL,所以你有效地写了

*NULL = *s;

你应该写

list[0] = new string;
*list[0] = *s;

或只是

list[0] = new string(*s);

(2)不是错误,但只要* s存在,*(list [0])就会存在。如果更改* s,则*(list [0])也会更改。您还应删除s或list [0],但不能同时删除两者。除非你真的需要这种行为,否则(2)是丑陋的。

一般来说,我不明白你为什么需要指针。因此,

string* list = new string[5];

会更清洁,

vector<string> list(5);

会更好。

最后,调用“list”不是一个好主意,因为这个名称有一个标准容器。 (既不会调用任何“矢量”,“设置”,“字符串”,“堆栈”或“地图”)。