错误:初始化时无法将字符 (*)[] 转换为字符**'

Error: cannot convert char (*)[] to char**' in initialization

本文关键字:字符 转换 初始化 错误      更新时间:2023-10-16

>我正在编写一个程序,其中不断出现错误。该程序从两个txt文件中读取数据,并在排序后将其打印出来。当我尝试使用指针到指针读取字符数组时遇到问题,如下所示:

int c;
cin >> c;
char** commands =  new char[c][256];  //first array read one complete line, and the second one read the array(data) of the lines
for(int i = 0; i <= c - 1; i++){
    cin >> commands[i];}

谁能告诉我我哪里做错了?任何帮助将不胜感激。

二维数组(矩阵)不是指针数组。

表达式 new char[c][256] 分配一个二维数组,一个由 c 个一维数组组成的数组,每个数组的大小为 256。结果是指向第一个此类项的指针,即char(*)[256]

相反,您尝试初始化的指针变量的类型为 char** ,它是指向 char 的指针。通常,这是指向指向char的指针数组中第一项的指针。该结构与您分配的内容不匹配。


二维数组称为矩阵

在 C 和 C++ 原始数组的上下文中,默认情况下,此术语意味着数组数组。

指向数组的

指针数组称为交错数组,因为它可以具有(指向)不同大小的数组。 例如,值围绕对角线对称的数学矩阵可以存储在大小为 1、2、3 等的数组中。在某些情况下,交错数组也用于实现方形数学矩阵。


一个好的解决方案是使用string vector代替原始数组:

vector<string> commands;

这样,您甚至不必预先指定大小。

用户不必指定大小,您只需push_back每个新命令即可。

此处vector<vector>标头std::vectorstring<string>标头std::string

对于读取命令,您可以使用 std:.getline ,也可以从 <string> 标头读取,这样可以避免一次只读取一个以空格分隔的"单词":它一次读取一整行。

试试这个:

int c;
std::cin >> c;
typedef char CmdBufType[256];
CmdBufType* commands = new char[c][256];
for(int i = 0; i < c; ++i)
{
    std::cin >> commands[i];
}

笔记:

  1. 你也可以写new CmdBufType[c];这与new char[c][256];相同
  2. 最好写i < c而不是i <= c - 1
  3. 首选前缀运算符 ( ++i ) 而不是后缀运算符 ( i++ )。在像这样的简单情况下,这无关紧要,因为不使用非递增值,编译器会对其进行优化。但是,如果i是一个对象,比如一个迭代器,那么它确实很重要。