初始化二进制搜索树中的字符串数组
initializing array of string in binary search tree
我的节点包含一个int和一个字符串变量,我尝试使用二进制搜索树。代码如下:
struct node{
int a;
string members[5];
};
int main(){
node * root = NULL;
root = (node*)malloc(sizeof(node));
root->members[0] = "aaaaa";
return 0;
}
当然,我的代码并不是那样的,我把它写得很短,主要是因为我想展示问题所在。它给了我"访问违规写入位置"。我尝试使用"new node();"而不是malloc,但这并没有发生。这到底是为什么?
malloc()
仅分配内存。它不调用对象的构造函数。您可以在分配的内存上调用构造函数,例如
void* mem = malloc(sizeof(node));
if (mem) {
node* root = new(mem) node;
// ...
}
当使用new node
而不是malloc(sizeof(node)
时,分配内存也被初始化。使用未初始化的对象是未定义的行为。
malloc
仅分配原始存储。new
分配原始存储并将其初始化为包含指定的类型。
如果你只分配POD类型,这种区别主要是措辞上的区别,在发生的事情上几乎没有真正的区别。
如果你正在分配像std::string
这样有构造函数的东西,那就有很大的不同了。如果使用new
,那么string
变量都已初始化,因此它们是真实的(尽管仍然是空的)字符串。当您只使用malloc
时,它们根本没有初始化——它们只是未初始化的原始存储块,大小适合包含string
。当你试图将它们用作字符串时,快速崩溃是你所能期望的最好结果。
相关文章:
- 将C#字符串数组传递给C++
- 如何为 C 型字符串数组编写 getter 和 setter?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 尝试将 c 字符串数组与分隔符连接起来
- 将字符串数组传递给接受常量字符**的函数
- 返回 C++ 中的字符串数组
- 如何从COM模块中的函数返回字符串数组?
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 删除字符串数组
- 如何将字符串数组返回到 java JNI
- 将字符串数组作为函数参数传递
- C++将字符串数组的元素存储到变量中
- 循环访问还包含未使用元素的字符串数组
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 乘以字符串/数组和全局数组
- 递归二进制搜索与字符串数组
- 如何初始化一个标准::字符串数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++字符串数组的动态向量
- 给定一个等长字符串数组