【问题标题】:Array of lists in c++. Pointers;/C++ 中的列表数组。指针;/
【发布时间】:2014-07-16 11:22:53
【问题描述】:

我正在尝试实现一个列表数组,但在动态内存分配方面存在一些问题,或者我对指针的理解还不够清楚;/.这是我的代码:

struct List {
    List * next;
    char * tab1;
    char * tab2;
};

int size =4000;
List ** array= new List*[size];

void add(char * table_one, char * table_two)
{
    int n=40;
    for(int cc =0; cc<size; cc++)
    {
        array[cc]->tab1 = new char[n];
        array[cc]->tab2 = new char[n];
    }
    ...
}

当我尝试为 tab1tab2 分配内存时发生未处理的异常错误:

array[cc]->tab1 = new char[n];
array[cc]->tab2 = new char[n];

我不知道这些行有什么问题:( 感谢任何提示!

【问题讨论】:

  • 您将 char 缓冲区放入 List 实例中。但是这是分配了一个特定的List[cc] 吗?这个例子对我来说也有点复杂。为什么 List 有指向下一个 List 的指针?
  • 您在array 中创建了一个指针列表,但它们指向哪里?
  • Too many pointers. 请改用适当的 C++。

标签: c++ arrays list pointers


【解决方案1】:
List ** array= new List*[size];

表明您在此处动态创建 List* 数组

array[cc]->tab1

如果不将List 分配给array[cc],您会尝试取消引用调用未定义行为的流氓指针。您应该为这些指针分配内存

array[cc] = new List;

或将List ** array= new List*[size]; 更改为List *array= new List[size];,以便您直接创建Lists 而不是List*s。


我认为混淆源于不理解多层次的指针(递归的概念)。当您分配一个指向 int 的指针时,您仍然没有整数空间来存储整数值,您所做的只是分配了一个指针 p (int pp** = new int*),它你用指针指向指针pp,现在你必须为指向的指针分配一个整数(new int)。然后,您可以将值存储在刚刚进行的分配中。

更多信息请阅读this post

【讨论】:

  • 感谢您解释那些(该死的!)指针。它真的对我有点帮助:) 我一定会从链接中阅读这篇文章。再次感谢!
【解决方案2】:

您的array 实际上是一个指针数组,因此您必须初始化每个元素。或者,您想要一个 List 对象数组。

第一个替代方案的解决方案是将您的 for 循环更改为以下内容:

for(int cc=0; cc<size; cc++)
{
    array[cc] = new List(); // Add this step
    array[cc]->tab1 = new char[n];
    array[cc]->tab2 = new char[n];
}

第二种选择的解决方案是更改 array 变量的类型。

List * array= new List[size];

然后使用.(一个点)而不是-&gt;(箭头)。

for(int cc=0; cc<size; cc++)
{
    array[cc].tab1 = new char[n];
    array[cc].tab2 = new char[n];
}

【讨论】:

  • 第一个解决方案工作正常。谢谢你:)但我对第二个有问题。在array[i] = array[i].next; 得到错误 2 错误 C2679: binary '=' : no operator found 它采用'List *' 类型的右手操作数
  • @aggy 您将指针List* 分配给List 类型的对象,因此错误,您应该执行array[i] = *array[i].next; 其中* 运算符将在array[i].next 指向的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2023-03-10
  • 2017-08-25
  • 2021-06-18
相关资源
最近更新 更多