4

私の宿題では、入力ファイルからデータを読み取り、それを 2 次元配列に格納してから、この配列を別の関数に渡す必要があります。これは私がこれまでに試したことですが、メインでこの関数を呼び出すとエラーが発生するかわかりません:

アクセス違反書き込み場所 0x00000000。

メモリを動的に割り当てようとしましたが、同じエラーが発生します。私が間違っていることは何ですか?

コードの最後の更新:

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

int *a[2];
void getData(void)
{
    FILE *fp = fopen("input.txt", "r");
    int number;

    fscanf(fp, "%d", &number);


    for (int i = 0; i < number; i++)
    {
        a[i]=(int*)malloc(number * sizeof (int));
        fscanf(fp, "%d %d", &a[i][0], &a[i][1]);
    }
    fclose(fp);
}


int main()
{   
    getData();
    for(int i=0;i<8;i++)
    {
        printf("%d %d\n",a[i][0],a[i][1]);
    }
}
4

2 に答える 2

5

メモリを割り当てる必要がありますa

for ループの前に

a = (int **)malloc(number * sizeof(int *))
于 2012-11-11T17:36:18.920 に答える
1

最初の次元を割り当てていません。つまり、a を逆参照しようとすると、null ポインターになります。

#include <stdlib.h>
a = malloc(number * sizeof *a);

ところで、sizeof(int)2 つの数値を格納するには不十分です。

#include <stdlib.h>
a[i] = malloc(2 * sizeof *a[i]); 
fscanf(iFile, "%d %d", &a[i][0], &a[i][1]);

これは完全に正しいコードです (完全ではありませんaが、巨大なグローバル変数である限り):

int (*a)[2] = NULL;

void getData(void)
{
    FILE *fp = fopen("input.txt", "r");
    int number;

    fscanf(fp, "%d", &number);
    a = malloc(number * sizeof *a);

    for (int i = 0; i < number; i++)
        fscanf(fp, "%d %d", &a[i][0], &a[i][1]);

    fclose(fp);
}
于 2012-11-11T17:36:36.123 に答える