使用结构创建数组

时间:2016-08-17 04:40:04

标签: c++ arrays pointers struct

我最近开始学习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中对未初始化指针执行算术是无效的。我对么?或者还有其他我想念的东西?

非常感谢。

2 个答案:

答案 0 :(得分:1)

您没有为动态阵列分配任何内存。真的,它看起来应该是这样的:

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而不是滚动自己的动态数组。

答案 1 :(得分:0)

这是你的代码:

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

首先,为什么不把它放在constructor中呢?它是一个与struct具有相同名称的函数,并且没有返回类型(甚至不是void)。只要实例化该类型的结构,就会调用它。

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

您的问题是您永远不会为elements分配内存。您正在对未初始化的指针执行算术和赋值,这是未定义的行为。您应该使用new关键字并为其指定大小。

elements = new int[size];

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

但你不必担心这种头痛。 STL有一个容器可以满足您的需求。 std::vector