指向动态声明的 cstrings 数组的指针

Posted

技术标签:

【中文标题】指向动态声明的 cstrings 数组的指针【英文标题】:Pointer to an array of cstrings declared dynamically 【发布时间】:2017-02-07 07:54:55 【问题描述】:
char ** ptr = new char *[3];
ptr[0] = new char [5];
ptr[1] = new char [6];
ptr[2] = new char [7];

cout<<"Enter first array: ";
cin.getline(ptr[0], 5);
cin.getline(ptr[1], 6);
cin.getline(ptr[2], 7);
for (int i=0; i<3; i++)
    cout<<ptr+i<<endl;

for (int i=0; i<3; i++)
    delete[] ptr[i];

当我运行这段代码时,它会给出以下输出:

    Enter first array: name
    0xf99c20
    0xf99c28
    0xf99c30

我实际上希望打印出用户输入。

有人能告诉我怎么做吗?

【问题讨论】:

Err... 解决方法? 您可能想打印ptr[i],它与*(ptr+i) 相同。顺便说一句,尽管你最后一个 delete[].. 在一个循环中,你仍然有泄漏。首选std::string 满足您的字符串需求,首选std::vector&lt;T&gt; 满足您的阵列需求 1.解决什么??? 2.您需要在代码末尾delete[] ptr。 3.你也可以声明char* ptr[3](而不是分配和删除它)。 4. 有更简单、更好和更正确的方法来做你想做的任何事情。 【参考方案1】:

ptr+i 的类型是char**,而不是char*,所以只是作为指针打印。要将其打印为字符串,请使用ptr[i],即char*

也就是说,使用std::vector&lt;std::string&gt;。然后您可以使用string version of std::getline。然后,您可以避免许多可能的问题,如匹配 newdelete、泄漏、处理更长的用户输入、处理不同数量的用户输入等。


另外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;endl(这些是解释链接)。

【讨论】:

@MuhammadIbrahim 如果这是您问题的解决方案,您应该接受答案...【参考方案2】:

当您打印ptr+i 时,您对指针概念有逻辑误解,它将为您提供内存中输入的实际地址位置

打印你可以使用的指针的值:

*(ptr+i)

或:

ptr[i]

还有getline (char* s, streamsize n );输入的最大流大小应该更大,因为在每个字符序列的末尾有一个空字符'\0',当你输入另一个输入时有换行符'\n'

cin.getline(ptr[0], 10);
cin.getline(ptr[1], 10);
cin.getline(ptr[2], 10);

解决方案链接: https://ideone.com/maSOSs

【讨论】:

以上是关于指向动态声明的 cstrings 数组的指针的主要内容,如果未能解决你的问题,请参考以下文章

动态内存分配与指向它的指针变量

指向数组的指针的 C++ 模板类动态数组

指向对象的指针数组的动态分配

如何得到指针指向的数组的长度

在 C 中声明指向结构的指针数组,但在需要之前不为结构分配内存

动态更改指向结构的指针数组的数据类型