c++ - 在类中声明对象的数组大小

标签 c++ arrays class segmentation-fault

当我尝试填充我的数组时收到“段错误”。所以我想在类中声明数组大小来声明数组的大小,以便它可以分配空间,但我收到了。

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/

相关文章:

c++ - 在类型删除的小对象优化中调试崩溃

c# - 如何在 C# 中将 sbyte[] 转换为 byte[]?

javascript - 在 JavaScript 中重写数组字面量

arrays - 如何将一组未知数量的参数传递给 MATLAB 中的函数?

c++ 如何将模板应用于模板类的子/友元?

java - 本地类和本地内部类有什么区别

c++ - 访问公共(public)头文件的多个源文件和头文件

c++ - 对一个类中的一个 vector 进行排序,第二个 vector 应与第一个 vector 一起移动

javascript - 获取某个div下给定类的元素,并获取每个值

c++ - 不明白为什么我会收到异常 : Access violation reading location 0x00000000