当我尝试填充我的数组时收到“段错误”。所以我想在类中声明数组大小来声明数组的大小,以便它可以分配空间,但我收到了。
error: invalid use of non-static data member ‘Array::Size’ error: from this location
//Current
class Array{
public:
int Size;
int Range;
int Array[];
};
//Problematic
class Array{
public:
int Size;
int Range;
int Array[Size];
};
或者还有其他方法可以防止段错误吗?
最佳答案
您正在尝试使用 C 习惯用法,其中结构的最后一个成员是一个非常短的数组(一个或者,如果编译器允许作为非标准扩展,则为零个元素)并且为该结构分配了额外的内存因此可以访问声明数组末尾之外的元素。这最初是一个非标准技巧,称为 struct hack ,或在某些编译器中为 zero-length arrays .它在 C99 中被标准化为 flexible arrays .
当你使用这个习语时,你需要为数组分配额外的内存,例如sizeof (struct Array) + sizeof (int) * number_of_elements
。否则,您不会为比您实际声明的更多的元素(通常是一个或零个)分配内存,并且当您尝试访问超出该数量的元素时,您会得到未定义的行为。
但是,您正在编写 C++,而不是 C99。即使您的编译器允许您这样做,依赖它也将是非常糟糕的做法,并且 C++ 比 C 更笨拙。
要么在类中存储一个指针并在构造函数中分配适当数量的内存,然后在析构函数中释放它,要么使用将为您管理内存的 C++ 类,例如std::vector
.
下面是一个使用 std::vector
的例子:
#include <vector>
class Array{
public:
int size;
int range;
std::vector<int> array;
Array(int size, int range) :
size( size ),
range( range ),
array( size, 0 )
{
}
};
关于c++ - 在类中声明对象的数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20284776/