C++ 如何初始化c字符串数组(无stl)

C++ 如何初始化c字符串数组(无stl),c++,arrays,c++11,crt,c-strings,C++,Arrays,C++11,Crt,C Strings,我想在MSVC2010中用零指针初始化c字符串数组 // Foo.h #pragma once class Foo { int sz_; char **arr_; public: Foo(); ~Foo(); // ... some other functions }; // Foo.cpp #include "Foo.h" #define INITIAL_SZ 20 Foo::Foo() : sz_(INITIAL_SZ) { // there I have to

我想在MSVC2010中用零指针初始化c字符串数组

// Foo.h
#pragma once
class Foo {
  int sz_;
  char **arr_; 
public:
  Foo();
  ~Foo();
  // ... some other functions
};

// Foo.cpp
#include "Foo.h"
#define INITIAL_SZ 20

Foo::Foo() : sz_(INITIAL_SZ) {
  // there I have to initialize arr_ (dynamic array and can be enlarged later)
  arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *)); // ??? 
  // or maybe arr_ = new ...
}

如何纠正初始化错误?我不允许使用STL、MFC等。

arr=newchar*[INITIAL_SZ]()可以-您甚至可以将其放入初始化列表中

arr_ = (char **)calloc(INITIAL_SZ * sizeof (char *));
应该是


arr_u=(char**)calloc(首字母SZ,sizeof(char*)

如果您真的想避免STL等,那么为什么不:

arr_ = new char*[INITIAL_SZ]();
你甚至可以把它放在初始化列表中


记住在析构函数中调用
delete[]arr\
。(正如@Nawaz在下面指出的,您可能还应该遵循三个规则,并定义一个合适的复制构造函数和赋值运算符。)

正确的方法是将
arr\ucode>重新定义为
std::vector
,并使用
vector::reserve()
来提示您希望拥有的字符串数量。让C++来照顾你的记忆。< /P> 但如果必须使用原始C字符串,则可能需要:

arr_ = new char *[sz_];
一,。构建一个合适的字符串类

二,。构建一个合适的数组类

三,。在字符串上使用数组


快乐地追逐内存泄漏、双重释放和内存损坏。

只是好奇而已。为什么没有STL?还有到目前为止你都试过什么?实际上,你那里的
calloc()
会将所有内容初始化为零(NULL)。如果不是
位,我会标记这个C..@yasouser-这是客户的要求,我不认为它会将它们初始化为零,是吗?(我不能完全确定初始化规则,但我认为需要额外的括号)并定义复制构造函数和赋值运算符:三的规则!是的,除了你没有回答他的问题。“我不允许使用STL、MFC等。”很明显,他在遵循一些特定的指导原则,所以你的回答如果不是有点自大的话,也是完全没有帮助的。@leetNightshade:这肯定是自大,是一种嘲讽。但是,不使用STL或MFC并不意味着您不能为内存管理创建自己的类。我的回答只是建议分解问题(字符串+数组),而不是一次解决所有问题。我知道这些类是不完美的,专家们会把它们弄错。+1预先做一点额外的工作,以避免数小时痛苦的字符串管理和手工调试。