使用结构创建数组
Creating array using structure
我最近开始学习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
相关文章:
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为