【问题标题】:Segmentation Fault when trying to index an array of arrays of objects via a pointer尝试通过指针索引对象数组数组时出现分段错误
【发布时间】:2023-03-07 11:05:01
【问题描述】:

有人可以告诉我为什么运行此程序会出现分段错误吗?我尝试了一个指向对象数组的数组的指针,我该如何解决这个问题? sf::Vector2 类的声明可以在这里找到:http://www.sfml-dev.org/documentation/1.6/classsf_1_1Vector2.php

非常感谢。

#include <SFML/System/Vector2.hpp>
#include <iostream>
class Tet
{
    public:
        Tet();
   private:
        static sf::Vector2 <int> I[4];
        static sf::Vector2 <int> J[4];
        static sf::Vector2 <int> *types[2];

};

sf::Vector2 <int> Tet::I[4] = {sf::Vector2 <int>(0,1),
                               sf::Vector2 <int>(1,1),
                               sf::Vector2 <int>(2,1),
                               sf::Vector2 <int>(3,1)};

sf::Vector2 <int> Tet::J[4] = {sf::Vector2 <int>(1,1),
                               sf::Vector2 <int>(2,1),
                               sf::Vector2 <int>(3,1),
                               sf::Vector2 <int>(3,2)};

sf::Vector2 <int>* Tet::types[2] = { I,J };                                   

Tet::Tet()
{
    //trying to print out x member of first vector of I 
    std::cout << (*(*(types))).x << std::endl; 
}

main()
{
    Tet t = Tet();
}

编辑:g++ 编译器

【问题讨论】:

  • 什么是 sf::Vector2,它是如何实现的?只看代码就会认为它应该可以工作。你能不能用更广泛可用的类型来重现它,因为没有访问 sf::Vector2 没有人能够接受它并尝试一下。
  • 正如预期的那样,一个简单的示例(将 sf::Vector2 替换为 char)似乎可以工作。
  • 手动拖入 Vector2 实现,这在 Visual Studio 2010 下可以正常工作。您使用的是什么编译器?

标签: c++ arrays pointers sfml


【解决方案1】:

您永远不会分配或实例化您引用的types 数组。 types 是一个指针,您不能将具体值分配给 nullptr,这就是您现在离开它的方式。

只需将其声明为数组而不是指针 sf::Vector2&lt;int&gt; types[2][4];

您可能想要考虑一个更简单更有效的设计,可能是通过拥有一个Vector2 对象、一个Matrix 对象,然后是Tet 对象,该对象具有一组矩阵,最好使用 STL 容器和算法。

【讨论】:

  • 谢谢。我希望能够索引类型数组并根据伪随机数生成器返回的索引值(0 或 1)返回 I 或 J
  • 您最好使用数组并将指针排除在外,这样您就不必担心内存管理。
  • 我想我可以声明一个二维数组 sf::Vector2 然后像 sf::Vector2 [2][4]
  • 他创建了一个指针数组,并将值分配给有效数据。无需分配任何额外的内存。
  • @Chad:示例代码正确地创建了一个指针数组,但错误地为其分配了一个对象数组。这种不匹配就是问题所在。不过,我不明白为什么 VS 2010 接受代码。
【解决方案2】:

也许先分配类型并用 { &I, &J } 进行初始化

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2016-02-23
    • 2017-02-19
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多