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