C++ 动态内存分配与结构中的数组

Posted

技术标签:

【中文标题】C++ 动态内存分配与结构中的数组【英文标题】:C++ dynamic memory allocation with arrays in a structure 【发布时间】:2013-07-10 17:31:19 【问题描述】:

有类似的问题,但它们都是用 C 语言,而不是 C++,所以我问了一个新问题。

我一直关注C++ tutorial,在完成动态内存、指针和结构部分后,我尝试将它们放在一个示例程序中。

本质上,我正在尝试动态分配结构数组(程序输入“produce”:P 并显示结果)。

编译器错误:'base operand of '->' has non-pointer type 'produce' 代码为 fruit[i]->item;

对不起,如果代码有点冗长(我不想省略部分以防它们是问题,即使这会导致问题“过于本地化”):

#include <iostream>
#include <string>
#include <new>

using namespace std;

struct produce 
    int price;
    string item;
;

int main(void) 
    int num;
    int i;

    //Get int for size of array
    cout << "Enter the number of fruit to input: ";
    cin >> num;
    cout << endl;

    //Create a dynamically allocated array (size num) from the produce structure
    produce *fruit = new (nothrow) produce[num];
    if (fruit == 0) 
        cout << "Error assigning memory.";
    
    else 
        //For 'num', input items
        for (i = 0; i < num; i++) 
            cout << "Enter produce name: ";
            //Compiler error: 'base operand of '->' has non-pointer type 'produce'
            cin >> fruit[i]->item;
            cout << endl;

            cout << "Enter produce price: ";
            cin >> fruit[i]->price;
            cout << endl;

            cout << endl;
        
        //Display result
        for (i = 0; i < num; i++) 
            cout << "Item: " << fruit[i]->item << endl;
            cout << "Cost: " << fruit[i]->price << endl;
            cout << endl;
        
        //Delete fruit to free memory
        delete[] fruit;    
    

    return 0;

【问题讨论】:

cin &gt;&gt; fruit[i].item; fruit[i] 返回对对象的引用,而不是指向对象的指针。所以你必须使用点运算符,而不是箭头运算符。 您正在创建一个生产对象数组,数组中的每个元素都是一个生产对象。 换句话说,fruit[i]produce 的一个实例,它不是指向produce 的指针。因此,正如编译器已经指出的那样,在其上使用 -&gt; 是错误的。 哦...我以为水果是指针 @user2569582... 你想的没错。 fruit 是一个指针。但是fruit[i] 是一个对象。 【参考方案1】:

我在你的代码中看到produce *fruit,所以,fruit 是一个指向一个或多个生产对象的指针。这意味着 fruit[i] 评估为单个实际的 produce 对象。因为它是一个对象,所以要访问它的item 成员,您可以使用. 符号。如果它是一个指针,你只会使用-&gt;。所以你需要把fruit[i]-&gt;item;改成fruit[i].item

【讨论】:

【参考方案2】:

考虑这个简单的例子来明确你如何访问一个对象,而不是一个指向对象的指针:

int *arr = new (std::nothrow) int[10];
for(int i=0; i< 10 ; ++i)

    arr[i]=i;

delete [] arr;

arr( 例如 arr[0]) 中的每个元素都是一个简单的 int,为了示例,它正在使用索引值初始化数组中每个元素的内容,然后删除 int 数组.对于您的情况,水果数组中的每个元素(水果 [0]、水果 [1] 等...)都是生产类型的对象(不是指向对象的指针)。因此访问必须使用访问运算符 . 而不是 ->

【讨论】:

@user2569582 指的是std 命名空间。 @notNullGothik 实际上,他的原始代码是abusing namespace std;,所以他的nothrow 不符合std @greatwolf 正确,因为我没有声明 using 语句,所以我使用了完全限定版本。原代码可以省略std。

以上是关于C++ 动态内存分配与结构中的数组的主要内容,如果未能解决你的问题,请参考以下文章

C++数组在内存中的分配

对删除分配给结构数组的动态内存感到困惑

C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配

C++内存分配及变长数组的动态分配

c++中字符串是如何分配内存的?

什么是 C++ 中的动态内存分配?