2016-11-17 24 views
-2

私は約10日前にCを学び始め、戦艦ゲームを書くことに決めました。 メンバーとして2d整数配列を持つ構造体プレーヤーがあります。構造体のメモリ割り当てとしての多次元配列C

struct player{ 
    ... 
    int field[X][Y];...}; 

私の場合、5と5の両方。私はちょうど得る

私がメインに新しいプレーヤーを作成し、print_field(int型フィールド[X] [Y])を呼び出して法(単にフィールドのすべてのメンバーを印刷していること)

int main(){ 
    struct player player1; 
    print_field(player1.field);} 


00000 18356276361600061541186983333419528026550 00010 41963970000 04196320041956320

のようないくつかのランダムなものは、私が

などのmallocとのcallocの異なる明白な方法を試してみました

しかし、私はポインター、配列またはキャスト例外の種類が異なります。

どうすればいいのか説明してください。

+2

[MCVE]をご提示ください。あなたは十分な情報を提供していません。私たちが言うことができるのは、表示していないコードのどこかにバグがあります。 –

+0

'player1'はinitedではないので、どの値を見たいのですか? – LPs

+0

注:Cは_methods_をサポートせず、_functions_のみをサポートします。 – Olaf

答えて

1

ローカル(非static)変数を定義し、またはmallocを介してメモリを割り当てる場合は、メモリがどのような方法で初期化されません。その内容は不確定であり、一見無作為である(現実には、その時点でメモリに存在することになる)。

初期化以外の方法でメモリを使用すると、という未定義の動作が発生します。あなたは、変数を定義する際

あなたは全体の構造を初期化することができます。

struct player player1 = { ..., { { 0 } } }; 

をまた

player1.field = malloc(sizeof(player1.field)); 

間違っであることに注意してください。コンパイラはそれについて不平を言うべきだった。配列に代入することはできません。また、メモリを割り当てる必要もありません。コンパイラは、player1変数を定義するときに、構造全体のメモリが割り当てられることを確認します。

-3

フィールドを割り当てる方法が問題です。 あなたが固定サイズが必要な場合、あなたは、単にあなたのフィールド

int field[5][5]; 

を呼び出すことができそうでない場合、あなたはそのように配分する必要があります:

int i = 0; 
player1.field = malloc(sizeof(player1.field) * size); 
while (i++ < size) 
    player1.field[i] = malloc(sizeof(player1.field) * size); 
+0

あなたはそれを手に入れませんでした。 XとYは#が定義されています –

1

値はINITようにするには、local variableとしてプレイヤー1を定義しました不確定。

あなたは、 "単に" compound literalsを使用して、構造体を初期化することができます

#include <stdio.h> 

#define X 5 
#define Y 5 

struct player{ 
     int field[X][Y]; 
}; 

int main(void) 
{ 
    struct player player1 = (struct player){.field={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14},{15,16,17,18,19},{20,21,22,23,24}}}; 

    for (size_t i=0; i<X; i++) 
    { 
     for(size_t j=0; j<Y; j++) 
     { 
      printf ("%d\n", player1.field[i][j]); 

     } 
    } 
} 
+1

値は不定で、ランダムではありません。 – Olaf

+0

@Olaf確かに、私の悪い英語。編集されました。 – LPs

関連する問題