2017-11-15 9 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); '를 먼저 사용하십시오. 2 차원 배열이 필요합니다. –

+0

@Sarah Collins 당신은 약 3 년 동안 지금까지 당신은 그렇게 나쁘지 않습니까? –

답변

0

배열 대신 포인터를 사용하고 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); 

당신은 포인터의 배열 할당, 그리고 코드의 나머지는 OK입니다 (의 반환 값을 캐스팅하지 않습니다

int **a; 

를 선언 할 malloc BTW)

변종은 다음과 같습니다

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

(따라서 형식이 a 인 경우 크기가 변경됩니다. 모든 포인터이므로 여기서는 중요하지 않습니다)