2012-01-29 9 views
1

ポイント(x、y)の配列を格納する必要があります。私はファイルからポイントを読み取り、ポイントの数は一定ではありませんが、私はファイルの最初の行でそれを得ることができます。だから、ファイルからポイントをロードし、それらをグローバル配列に格納するための手続きload()を記述します。それは動作しません。 私のコードは:実行時に整数のグローバルな2次元C配列を初期化する

int *array[][]; // this is a pointer to a 2-dimensional array?? 

void load(){ 
.. 
int tempArray[2][n]; //n is the first line of the file 
.. 
array = tempArray; 
} 

答えて

3

あなたは、変数を定義する関数に対してローカルなメモリへのポインタを返すようにしようとしています。その機能が動作を停止すると(「範囲外になる」)、そのメモリは何か他のものに再利用されるので、後で参照しようとするのは不正です。

ダイナミックアロケーションを調べて、ローディング機能に必要なメモリを割り当てて返すようにしてください。

関数プロトタイプは、かもしれない:filenameは、ファイルの名前が開か勿論である

int * read_points(const char *filename, size_t *num_points); 

num_pointsが見つから点の数、および戻り値に設定されているが、アレイへのポインタでありますインターリーブされたxおよびy値を保持する。だから、これは最初のポイントロードの座標を印刷します:

size_t num_points; 
int *points; 

if((points = load_points("my_points.txt", &num_points)) != NULL) 
{ 
    if(num_points > 0) 
    printf("the first point is (%d,%d)\n", points[0], points[1]); 
    free(points); 
} 
0

よりエレガントなバージョンは次のように行くかもしれない:

typedef struct point_ { int x; int y; } point; 

point * create_array(size_t n) 
{ 
    return calloc(n, sizeof(point)); 
} 

void free_array(point * p) 
{ 
    free(p); 
} 

int main() 
{ 
    size_t len = read_number_from_file(); 
    point * data = create_array(len); 

    if (!data) { panic_and_die(); } 

    for (size_t i = 0; i != len; ++i) 
    { 
     /* manipulate data[i].x and data[i].y */ 
    } 

    free_array(data); 
    data = 0;   /* some people like to do this */ 
} 
0

あなたは配列を代入しようとしているが、Cアレイに割り当てることはできません。

memcpyを使用して、1つのアレイを別のアレイにコピーします。 Cの配列要素は連続していることが保証されています。

int bla[N][M] = {0}; 
int blop[N][M]; 

/* Copy bla array to blop */ 
memcpy(blop, bla, sizeof blop); 
2

あなたのこの宣言は動作しません:

int *array[][]; // this is a pointer to a 2-dimensional array?? 

まず、int *の2次元配列を宣言しようとしています。第2に、配列を宣言または定義するときは、最初の次元以外のすべての次元を指定(サイ​​ズ指定)する必要があります。

int (*array)[][2]; // This is a pointer to a 2D array of unknown size 

これは、機能の主要な変種で使用できるようになりました。私はあなたの質問を最初に誤解していたので、それは変種です。

void load(void) 
{ 
    ... 
    int tempArray[n][2]; // Note the reversed order of dimensions! 
    ... 
    array = &tempArray; 
    ...there must be some code here calling functions that use array... 
    array = 0; 
} 

割り当てには、アレイ名に&が必要であることに注意してください。他の機能では、次のように記述する必要があると思います。あまりにも

n = (*array)[i][j]; 

注意を、グローバル変数にローカル配列のアドレスを割り当てることは危険であること。ファンクションload()が返されると、tempArrayの記憶領域は無効になります。したがって、代入を行う唯一の安全な方法は、グローバル変数を参照する関数を呼び出してから、関数を終了する前にグローバルをリセットすることです。 (または、少なくとも値が無効であることを認識しますが、ヌルポインタを0に設定すると、ランダムメモリにアクセスするのではなく、プログラムがクラッシュする可能性がより低くなります。

また、配列の動的メモリ割り当て。

あなたの質問は、実際の変数の次元が最初ではないVLA、可変長配列へのグローバルポインタを作りたいと思っている

int tempArray[2][n]; // Note the reversed order of dimensions! 

あなたは、単にこのようにグローバルポインタを作成することはできません配列。

ので、複数の問題があります:あなたは、マルチするグローバルポインタを持つことはできません

  • は、ローカル変数へのグローバルポインタを割り当てる配列へのポインタを初期化
  • を配列へのポインタのための

    • 表記可変長さが第1の次元にない次元VLA。
    • グローバルの使用を最小限に抑える必要があります。
  • 関連する問題