2012-03-11 3 views
1

배열 크기가 프로그램에서 사용자가 정의한 구조체 배열을 만들려고합니다. 예. P [0], P [1], P [2] .....동적으로 구조체 배열 배열을 할당합니다.

typedef struct 
{ 
int score; 
}player; 

void main() 
{ 
    int numPlayers; 

    printf ("\nEnter number of players (1 - 4)\n"); 
    scanf ("%d", &numPlayers); 

} 

둘 다

player p[numPlayers]; 

player *p=malloc(numPlayers*sizeof(player)); 

만에 그 일을 시도했습니다 둘 다 컴파일되지 않습니다. 누군가 여기서 무슨 일이 벌어지는 지 볼 수 있습니까?

편집 : VS2010을 사용하고 있습니다. 첫 번째 표현식에 "표현식에 상수 값이 있어야합니다"가 표시되고 "void *"유형의 값을 사용하여 두 번째 표현식 유형에 "player *"유형의 엔티티를 초기화 할 수 없습니다 ..

+0

어떤 컴파일 오류가 발생합니까? –

+0

컴파일러는 무엇이며 컴파일러 오류는 무엇입니까? – hmjd

답변

1

player p[numPlayers]; 접근 방식은 "가변 길이 배열"을 요구합니다. 이것은 몇 년 전에 GNU C 언어에 등장한 기능으로, 1999 년에 C 언어로 채택되었습니다. 컴파일하기 위해서는 이것을 확장자 또는 C99 컴파일러로 인식하는 컴파일러가 필요합니다. 가변 길이 어레이에는 단점이 있습니다. 일반적으로 스택에 메모리를 할당하여 구현됩니다. 메모리가 충분한 지 여부를 감지 할 수있는 방법이 없습니다.

당신이 가지고있는 malloc을 호출하는 구문은 괜찮 : 당신이 당신의 기능이 어디를 작성하려면

player *p=malloc(numPlayers*sizeof(player)); 

그러나, 당신이 간 연합 받아들이는 C99 컴파일러 또는 컴파일러를 사용해야 명령문 및 선언 (C99 이전의 확장 기능을 GNU C와 동일하게 사용하며 기본적으로이를 수용합니다.) C90에서 함수의 상단에있는 선언 블록 (또는 braced 명령문)에서 포인터를 선언해야합니다. player *p = NULL;. 그런 다음 플레이어 수가 알려지면 p = malloc ...에 할당하십시오.

컴파일하지 않는 실제 프로그램을 게시해야합니다. 그것 없이는 우리는 추측하고 있습니다!

또한 몇 가지 문제가 있습니다.

첫 번째로 malloc을 호출하려는 경우 malloc이 선언 된 <stdlib.h> 헤더를 포함해야합니다. 둘째

, main 유형 int하지 void를 반환해야합니다.

또한 scanf의 반환 값을 확인하십시오. scanf 함수는 대화식 입력에 좋지 않습니다. 예를 들어, 사용자가 Enter를 누르는 경우, scanf은 입력을 기다리고, 그 숫자가 아닌 문자를 찾습니다. 이는 비우호적입니다.scanf%d에 오류 검사가 없습니다. 유형 int에 맞지 않는 숫자를 입력하면 동작이 정의되지 않습니다. 이 유형의 입력 처리는 작성자가 직접 사용하기 위해 작성된 신속하고 지저분한 "폐기"프로그램에만 적합합니다.

+0

"... 1991 년에?" 정말? "1999"어쩌면? –

+0

답장을 보내 주셔서 감사합니다. scanf 이후에 실제로 malloc을 호출했습니다. 여전히 작동하지 않더라도 상황을 바꿀 수 있습니다. 빈 프로젝트에 아래의 hmjd 코드를 사용했는데 언급 한 두 번째 오류가 계속 발생합니다. – karoma

+0

이것은 실제로 C++로 작성하기 때문일 수 있습니다. C++에서는'void *'타입의 포인터를'player *'에 할당 할 수 없습니다. 이는 유형 안전 변환이 아닙니다. 규칙은 C에서 완화됩니다 ('void'유형은 원래 C++에서 온 것입니다!). C++에서'player * p = (player *) malloc (...) '과 같은 캐스트가 필요합니다. '.cpp' 접미사로 파일을 저장 했습니까? 어쨌든, C++로 작업한다면, C++에 질문을 태그하십시오. – Kaz

1

하나의 가능성은 #include <stdlib.h>을 잊어 버린 것입니다. 프로토 타입이 없으면 컴파일러는 malloc이 캐스트가없는 포인터로 변환되지 않고 int을 반환한다고 가정합니다 (그러나 캐스트 포함은 사용하지 않습니다). 적절한 헤더는 그래서 컴파일러) 대신 반환 유형을 알고

편집 :.. 그것은 관련이없는,하지만 FWIW는, mainint을 반환해야하지 void

+1

그리고 C++ 컴파일러 일 경우 함수가 선언되지 않았기 때문에 프로그램을 거부합니다. – Kaz

+0

'main'은 컴파일러가'void main'을 거부 할 수 있기 때문에 완전히 관련이 있습니다. 너는 결코 알지 못한다. 초보자는 교사에 의해'-Werror'와 함께 gcc를 사용하라는 말을들을 수있었습니다. :) – Kaz

+1

@ 카즈 : 이론적으로는 그렇습니다. 그의 의견에 따르면, 아니오. –