【问题标题】:How do I initialize this array of pointers?如何初始化这个指针数组?
【发布时间】:2026-01-26 02:55:02
【问题描述】:

我真的不确定它是什么(如果它是指针数组,还是指针数组的数组???),但是当我通过调试器踩到它时,它给了我 0xCDCDCDCD,这意味着内存已分配,但未初始化。谁能告诉我如何初始化它?

谢谢。

char* (*vars)[4];

我试过这样的东西,但它给出了编译错误:

for (int i = 0; i < 4; i++)
    vars[i] = new char*[new char*][4]; // error C2440: 'initializing' : cannot convert from 'char **' to 'unsigned int'

【问题讨论】:

  • 如果你不确定它是什么,你为什么要尝试使用它?
  • 我认为告诉我们您想要完成的工作会更好,让我们帮助您做到这一点。我很难弄清楚你想做什么,这是正确的方法。
  • 这看起来过于复杂了。
  • 说实话,我不知道它是什么。一位前同事将它作为双倍,我被要求将其更改为字符串(或 char*)。所以我把它从“double (vars)[4]”改成了“char (*vars)[4]”。
  • 我最终使用了一个二维 CString 数组:[CString (*vars)[4];] [vars = new (CString[100][4]);]。这更容易实例化和释放。谢谢大家的建议。

标签: c++ arrays pointers initialization


【解决方案1】:

首先,你需要使用cdecl

将 vars 声明为指向 char 指针数组 4 的指针

你如何初始化它取决于你的目标是什么。但是,例如:

// Create a new array
vars = new (char *[1][4]);
// Each element of the array in turn points to an array
for (int i = 0; i < 4; i++) {
    (*vars)[i] = new char[27];
}

...

// Cleanup
for (int i = 0; i < 4; i++) {
    delete [] (*vars)[i];
}
delete [] vars;

最后,你不应该在 C++ 中编写这样的代码。总有更好的方法来做任何你想做的事情(通常涉及容器和智能指针)。

【讨论】:

  • 谢谢,除了第一行外,一切正常。它说,错误 C2440: '=' : cannot convert from 'char *' to 'char *()[4]'
  • @SoftwareGuy:好的,我已经解决了。我的例子是错误的,因为我从不使用这样的结构,所以我没有练习!
  • 现在构造函数可以工作了,但是当第一次删除被命中时,析构函数会抛出一个 Debug Assertion Failed 消息:“Expression: _CrtIsValidHeapPointer(pUserData);” “表达式:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse);” “试图读取或写入受保护的内存。这通常表明其他内存已损坏。”
  • 由于我无法释放内存,我不得不遵循这里给出的一般建议,即寻找不同的结构。不过,您的代码中的其他所有内容都有效,它让我对我所追求的这种晦涩的结构有了一些宝贵的见解。再次感谢!
【解决方案2】:

vars 是一个指向由 4 个指向 char 的指针组成的数组的指针。

你不能在 C++ 中嵌套索引new,所以你可以这样做:

vars = new (char*)[4];
for(int i=0; i<4; i++) {
     (*vars)[i] = ...;
}

循环的内部,该数组中指针的初始化,很大程度上取决于程序的其余部分。

但是说真的,如果你开始写这样的东西,无论你服用什么药物,要么多吃,要么少吃。

【讨论】:

    【解决方案3】:

    double (vars)[4]; 只是声明了一个包含 4 个双精度数的数组。 (可选的括号只是令人困惑)。如果你想要一个由 4 个字符串组成的数组,请使用 char *((vars)[4]);(好吧,我用括号过分了。)然后你可以将它们初始化为 null,或者分配新的字符串,或者将它们指向预分配的内存。

    char *vars[4];
    for (int i = 0; i < 4; i++)
        vars[i] = new char[I_HOPE_THIS_IS_BIG_ENOUGH];
    

    【讨论】:

    • 感谢您的选择。我正在试一试,看看让一切适应新结构是多么容易。
    • 这个想法真的很好。我最终得到了一个二维 CString 数组,其中“I_HOPE_THIS_IS_BIG_ENOUGH”设置为 100 个项目。实际上,我们知道我们不会达到这个目标...感谢您的建议和帮助。