0

返された構造体の2次元配列にアクセスしようとしています。それらが作成された関数でそれらにアクセスできますが、それを渡すと参照が失われるようです。私はそれを行うための千の方法に疲れましたが、それは違いを生まないようです。常にセグメンテーション違反が発生します。

それでの私の現在の実行は次のようになります:

単純な構造体:

typedef struct{
    int weight;
} myStruct_t;

myStruct_tの2次元配列を作成する関数。それを引き出すための私の現在の試みは、最後の2行に見られるように、「マップ」へのポインターとして機能する新しい変数を作成することです。

myStruct_t*** makeGrid(int sizeX, int sizeY)
{  
    int i;

    myStruct_t **map = malloc(sizeX * sizeof(*map));  

    if(map == NULL){
        printf("Unable to set memory, Exiting\n");
        exit(1);
    }else{  
        for ( i = 0; i < sizeX; i++)
        {
            map[i] = malloc(sizeY*sizeof(myStruct_t));

            if(map[i] == NULL)
            {
                printf("Unable to set memory, Exiting\n");
                exit(1);
            }else{
                printf("success!\n");
            }
        }
    }

    myStruct_t ***mapPtr = &map;
    return mapPtr;  
}  

次に別のファイルで:

void initSys(){
    myStruct_t** map = *myStruct_t(100,100);    
    map[0][0].weight = 7;

   //or i also just tried
   //myStruct_t*** map = myStruct_t(100,100);
   //(*map)[0][0].weight = 7;

}

出力はSegFaultです。Cメモリ管理を完全に忘れてしまい、元に戻せないようです。

どんな提案も素晴らしいでしょう。

4

1 に答える 1

2

バグはオンラインです

myStruct_t ***mapPtr = &map;

そのはず:

 return map;

また、リターンタイプをダブルポインタに変更する必要があります。

「&map」を返すと、変数のアドレスが返されますmap。変数mapはスタックに格納されているため、無効なメモリにアドレスを返しています。

于 2013-02-16T07:23:04.933 に答える