2017-11-26 22 views
1

私はテキストゲームの作成を含むプロジェクトを持っています。私は各プレーヤーのための構造体を作成し、それらを配列に入れています。私はその後、データを渡して、ポインタを他の関数に渡していますが、セグメンテーションフォールトを取得し続けます(奇妙なことにはうまくいきますが)。私は以下に要約した。Segfaultsと構造体配列の参照

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    char name[9]; 
    int cardsHeld; 
    int hand[8]; 
} Player; 

void printNames(Player** playerArray) 
{ 
    for (int i = 0; i < 3; i++) 
    { 
    fprintf(stdout, "%s\n", playerArray[i]->name); 
    } 
} 


void gamesetup() 
{ 
    int count; 

    fprintf(stdout, "How many players will be partaking in 'The Game'? (1 - 5)\n"); 
    fscanf(stdin, "%d", &count); 

    Player** playerArray = (Player**)malloc(sizeof(Player*) * count); 

    for(int i = 0; i < count; i++) 
    { 
    playerArray[i] = (Player*) malloc(sizeof(Player)); 
    fprintf(stdout, "Please enter the name for player %d.\n\n", i + 1); 
    fscanf(stdin, "%s", playerArray[i]->name); 
    } 

    printNames(playerArray); 
} 

int main(int argc, char** argv) 
{ 
    gamesetup(); 

    return 0; 
} 

私の質問は次のとおりです。

  1. fscanfはPlayer.nameメンバーのアドレスを取得していますか?私は混乱しているかどうか - >演算子は、構造体のメンバーの値を尊重する必要があるか、その配列のアドレスですか?

  2. 私はそれが時々動作するが、他は動作しない理由はわかりません。時には基本的にはうまくいくはずです。 malloc関数がメモリを割り当てていないか、またはデータを間違った場所に置いていますか?

ありがとうございます。

-EDIT-

それはワンセグの故障せずに動作するように見える完全なプログラムであるように、コードを変更しました。私は、私の問題は、終了する前にメモリを解放しないことから発生すると思います。次回は、最初にコンパイルせずに実行します。私はfscanfがなぜ私の心のように動作するのかまだ分かりません。引数playerArray [i] - > nameがアドレスではなく値を返しています。

+1

あなたは完全なコンパイル可能なプログラム( 'main()'関数など)に書くことができますか?問題が依然として現れる位置まで最小化してください。今すぐ問題がこのスニペットやコードにあるのか、それともコードの外側にあるのかを確認するのは難しいです。また、コンパイラの警告をオンにして、コンパイラが何を表示しているかを確認してください。 – ilkkachu

+0

名前に最大8文字ありますか?それで 'gameController(playerArray);'はわれわれにとって神秘的です。 –

+0

配列の「値」は最初の要素のアドレスです。 – melpomene

答えて

0

私は混乱しているところでそれを解決しました。コメントのすべてのあなたの助けをありがとう。

私の配列でアクセスしているメンバは文字列で、最初のメンバはポインタです。 fscanf(stdin、 "%s"、playerArray [i] - > name);を使用すると、これはポインタ(アドレス)を参照して動作するようになりました。それは構造体の配列のメンバーだったので、私は混乱していた。 segfaultsは、すでに働いていたものを試して修正するためのコードをいじっていたために起こったものです。