2017-11-15 10 views
2

私は事前に定義された文字数または配列の入力なしでCで配列内に配列を作成したいと思います。 'A':私はエラーに事前定義されたサイズのない配列をC言語で作成するにはどうすればよいですか?

C(2133)を投げてきた

{ 
    int noOfStudents,noOfItems; 
    int *grades; 
    int i; 
    char a[]; 
    printf("Please enter number of students\n"); 
    scanf("%d", &noOfStudents); 
    printf("Please enter number of items\n"); 
    scanf("%d", &noOfItems); 

    for (i = 0; i < noOfStudents; i++) 
    { 
     a[i] = (int *)malloc((sizeof(int))*noOfItems); 
    } 

: 次は私のコードで不明サイズ

私は正常に配列を作成するにはどうすればよいですmallocを使って配列内で?

+0

何の配列ですか? charまたはint ?? 'int ** a = malloc(sizeof(int *)* nbOfStudents);を使用してください。二次元配列が必要です。 –

+0

@サラ・コリンズあなたはここ3年ほどで、今まであなたはとても悪いですか?:) –

答えて

0

arrayの代わりにポインタを使用し、そのポインタのメモリをmallocまたはcalloc関数を使用して動的に割り当てます。このよう

int *a; 

a = malloc((sizeof(int)*noOfItems); 
-2

あなたは動的にメモリを割り当て、そのポインタを返す関数mallocを、しようとします。次に、特定の型の配列を指すポインターにポインターをキャストできます。

+4

「mallocate」について聞いたことがありません –

+0

答えを更新するか、それを削除しても誰にも良いことではありません。最高に、それは誤解を招き、有用ではありません。 –

+0

これはtypoです –

2

VLA (Variable length array)を使用できます。

あなたは、整数項目のリストのリストを保持するための二次元配列を、欲しい

int noOfStudents = -1, noOfItems = -1; 
int *grades;        //is it used? 
int i; 

printf("Please enter number of students\n"); 
scanf("%d", &noOfStudents); 

//fail check 

int *a[noOfStudents];    // this needs to be proper. 

//VLA 

printf("Please enter number of items\n"); 
scanf("%d", &noOfItems); 

//fail check 

for (i = 0; i < noOfStudents; i++) 
{ 
    a[i] = malloc(noOfItems * sizeof(a[i])); //do not cast 
} 
+4

ポインタのVLAではなく、int(* a)[noOfStudents] = malloc(sizeof * a * noOfItems);を使用することもできます。 – mch

+0

@mch間違いなく、ちょっと別のアプローチです。 –

2

のようなあなたのコードを再配置する必要があります。整数ポインタのポインタを宣言することでそれを行うことができます。

だから、あなたはその後、

printf("Please enter number of students\n"); 
if (scanf("%d", &noOfStudents)==0 && noOfStudents<=0) // bonus: small safety 
{ 
    printf("input error\n"); 
    exit(1); 
} 
// now we are sure that noOfStudents is strictly positive & properly entered 
a = malloc(sizeof(int*)*noOfStudents); 

int **a; 

を宣言したいそして、あなたが割り当てられたポインタのあなたの配列を持っており、あなたのコードの残りの部分はOKです(の戻り値をキャストしないでくださいmalloc BTW)

変異体である:

a = malloc(sizeof(*a)*noOfStudents); 

(したがって、タイプがaの場合、すべてのポインタなので、サイズは変わりません。

関連する問題