更新: 在底部回答。
嗨,大家好,
如何初始化'结构指针数组'?问题是,数组是一个成员变量,传递给构造函数中数组声明的大小是变量实体。
typedef struct Node {
string key;
int value;
struct Node * left;
struct Node * right;
}doubly;
class myHashStrKey{
private:
size_t hashsize;
doubly * table[];
public:
myHashStrKey(){
hashsize = ((size_t)-1);
doubly * table[hashsize];
memset(table,NULL,hashsize);// This is giving segmentation fault
}
};
//Called constructor; myHashStrKey sss = myHashStrKey();
这里我希望表是一个指向Doubly节点的指针数组,我希望所有指针都被初始化为NULL。这个代码在这里有什么问题?还有什么更好的方法来执行上述操作?提前谢谢。
更新:
讨论之后,考虑到大小很大,我已经修改了代码。但是如何使用一定数量的NULL值填充向量表?我尝试了下面的代码,但它不起作用。
<pre><code>
for(int i =0;i < hashsize;i++){
table.push_back((doubly *)NULL);
}
table.insert(table.begin(),hashsize,NULL);
//Both give invalid static_cast from type `int' to type `doubly*'
</code></pre>
答案更新:
myHashStrKey::table(myHashStrKey::hashsize, static_cast(0));
myHashStrKey::table(myHashStrKey::hashsize);
//Above 2 does not work
for(int i =0;i != myHashStrKey::hashsize;i++){ //lesser than symbol spoils the display
myHashStrKey::table.push_back((doubly *)NULL);
}
//Above works
myHashStrKey::table.insert(myHashStrKey::table.begin(),hashsize,((doubly *)NULL));
//This too works
答案 0 :(得分:2)
C ++标准不支持可变长度数组。相反,只需使用std::vector
:
private:
std::vector<doubly *> table;
...
myHashStrKey()
: table(num_elements, NULL) // Initialises vector
{
...
}
答案 1 :(得分:0)
该行
doubly * table[hashsize];
创建一个本地变量 table
,它会遮盖相同名称的成员。
还要注意该行
memset(table,NULL,hashsize);// This is giving segmentation fault
设置hashsize
字节时不正确,而table
是hashsize
指针的数组,每个这是一个以上的字节(通常是32位机器上的4个字节),即sizeof(table) >= hashsize * sizeof(doubly*)
然而,段错误可能是试图写入大量内存(至少4G)的结果,正如@Nawaz指出的那样。)
答案 2 :(得分:0)
如评论所述,您应该使用std :: vector。
您应该更仔细地查看STL提供的内容。否则你会错过许多C ++不错的功能,并且会用类做C。尝试熟悉RAII以了解有关C ++内存管理可能性的更多信息(http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)。像memset这样的东西在现代C ++中并没有被广泛使用。