使用结构创建数组

Creating array using structure

本文关键字:数组 创建 结构      更新时间:2023-10-16

我最近开始学习c++来改变我的职业生涯。

我了解一些基本的指针逻辑,我想用这个结构创建一个数组。

基本上,这是我目前写的代码:

struct arr{
private:
    int size;
    int *elements;
public:
    void createarray(int start, int end);
    void printa();
};
void arr::createarray(int start, int end){
size=end-start;
for(int i=0;i<=size;i++){
    *(elements+i)=start+i;
}
}
void arr::printa(){
    for(int i=0;i<=size;i++){
        cout << *(elements+i) << endl;
    }
}
所以基本上,我的逻辑是:如果我可以创建一个指针变量来存储c++的随机内存地址,并执行自增指针运算,那么我基本上可以使用结构体或类创建自己的数组符号。 但是上面的代码给了我一个错误。所以,我猜这是因为在c中对未初始化的指针执行算术是无效的。我对吗?还是我还遗漏了什么?

您没有为动态数组分配任何内存。实际上,它应该看起来像这样:

struct arr {
private:
    int size;
    int *elems;
public:
    // createarray should be a constructor
    arr(int start, int end) {
        size = end - start + 1;
        elems = new int[size];
        for (int i = 0; i < size; i++)
            elems[i] = start + i;
    }
    // clean up memory
    ~arr() {
        // make sure to include the '[]'
        delete[] elems;
    }
    // print array
    void printa() {
        for (int i = 0; i < size; i++)
            std::cout << elems[i] << "n";
    }
};

当然,理想情况下,您应该使用std::vector而不是滚动您自己的动态数组。

你的代码:

void arr::createarray(int start, int end){
    size=end-start;
    for(int i=0;i<=size;i++){
        *(elements+i)=start+i;
}

首先,为什么不把它放在constructor中呢?它是一个与结构体同名的函数,没有返回类型(甚至没有void)。在实例化该类型的结构体时调用。

其次,数组和指针在C语言中几乎可以互换。*(elements+i)也可以写成elements[i]


您的问题是您从未为elements分配内存。您正在对未初始化的指针进行算术和赋值,这是未定义行为。你应该使用new关键字,并给它一个大小。

elements = new int[size];

当你new某事时,当你完成某事时,你也必须delete它。否则就会泄漏内存。合理的地方是在析构函数中(与构造函数相同,前缀为~,但在结构体实例死亡时调用)。

但是你不必担心这个头痛。STL有一个容器,可以做你想做的事情。std::vector