-2

別のタイプの構造体の配列を指すポインターを構造体に持たせようとしています。これが私のコードです:

struct Mesh 
{
    long masterRef;                 // The global fragment number
    long polygonCount;              // Number of polygons in the mesh
    long vertexCount;               // Number of verticies in the mesh
    Vertex *verti;                  // Pointer to verticies in the mesh
    Poly *poly;                     // Pointer to polygons in the mesh
    float center[3];                // The center of the mesh
    bool isVisible;                 // Is the mesh currently visible?
} typedef Mesh;

struct Region 
{
    bool hasPoly;
    long size1; 
    long size2;
    long size3;
    long size4;
    long size5;
    long size6;
    Mesh* meshptr; // the mesh with the polygons for this region
    long meshRef;
    std::vector<int> visvector;
    long regionsVisible;
};

ご覧のとおり、Region 構造体でメッシュ ポインターを作成しようとしています。ポインターは、メッシュ配列内のメッシュを指します。この行だけで、プログラムがクラッシュし、デバッグ アサーションの失敗メッセージと「式: 無効なヌル ポインター」が表示されます。

問題が何であるかを知っている人はいますか?呼び出しコードを投稿しますが、それがないとクラッシュします。

4

1 に答える 1

2

あなたの問題は、「構造体の配列を指すポインターを構造体に持たせようとしている」ことだと思います。配列へのポインタを宣言するには、少し異なる構文が必要です: Mesh (*meshptr)[array_size];. あなたの構造が今立っているmeshptrように、単一へのポインタですMesh配列ではなくオブジェクト。そのポインターを配列のように使用しようとすると、ポインターに続くメモリに直接アクセスすることになるため、問題が発生します。これは、ポインターをデータ構造の最後に移動すると機能するように見える理由を説明している可能性があります。これを行うと、ポインターに続く構造体メンバーが破損するのではなく、構造体に続くメモリが破損します。おそらく、コードが構造体の最後の 3 つのフィールドの 1 つを破損しており、その破損が表示されているエラーの原因である可能性があります。ポインターを最後に移動すると、エラーが停止する可能性がありますが、問題は解決しません (まだメモリが破損しているため、予期しない影響がいくつも発生する可能性があります)。

これは、私が過去に行ったばかげたことに基づく憶測にすぎません。もっと多くのコードがなければ、確実に判断する方法はありません。

于 2011-06-08T00:56:04.383 に答える