2014-04-27 2 views
0

3 가지 가변 크기 배열이 있습니다. 단순히 하나는 2D char 어레이이고 다른 두 개는 unsigned int 어레이입니다.배열이 충돌하지 않도록하려면 어떻게해야합니까?

;

char names[numberOfPeople][MAX_NAME_SIZE + 1]; 
unsigned int ages[numberOfPeople]; 
unsigned int weights[numberOfPeople]; 

매크로 MAX_NAME_SIZE는 프리 프로세서로 (10)로 정의된다 그래서 사람들이 공통의 이름을 보자. numberOfPeople은 사용자에게 묻고, 사용자는 fgets을 입력하고 일부 절차 후에 변수로 읽습니다.

VLA를 사용하는 것이 좋지만 배열 정의 뒤에 사용자의 변수 값이 numberOfPeople이되는 기능이 있습니다. 그래서 어레이는 변경되기 전에 numberOfPeople의 초기화 된 값으로 정의됩니다.

이제는 문제가 있습니다. 어떻게 동적으로 메모리를 할당하고 나중에 배열을 초기화 할 수 있습니까? 내가 calloc에 대한 몇 가지 문서를 읽었지만, 알 수 있듯이 배열은 배열에 대한 포인터가 아닙니다. 그래서 calloc을 사용하는 올바른 구문을 찾을 수 없습니다. void *으로 되돌아갑니다. 어떻게해야합니까?

배열을 배열의 포인터로 정의해야합니까? 그리고 첫 번째 배열은 char 배열입니다. 중요합니까?

+1

** 'numberOfPeople'이 초기화 된 후 ** 배열의 선언을 넣지 않는 이유는 무엇입니까? –

+0

여기에 메모리를 할당 할 필요가 없습니다. 사용자에게 질문하고 입력을 확인한 후 배열을 선언하십시오. – Chnossos

+0

그럼, 다른 제안은 전혀 없습니까? – Leviathlon

답변

0

아마도 아래의 의사 코드가 도움이 될 것입니다.

컴파일 타임에 배열을 정의하는 대신 런타임에 배열을 동적으로 정의하십시오. 컴파일시에는 배열의 크기를 알지 못하기 때문에 배열을 '가리 키도록'정의하고 크기를 알면 (런타임에) 배열에 메모리를 할당하는 것에 대해 걱정하십시오 :

char *names; 
unsigned int *ages = NULL; 
unsigned int *weights = NULL; 

코드를 문자열로 "사람의 수"를 요청할 수는 fgets와 함께 사용되는 다음과 유사한 저장,() 가지고 (당신이 당신의 질문에이 정보를 공유하지 않았기 때문에) 나는 가정

char tmpStr[MAX_NAME_SIZE]; 
int numberOfPeople; 

printf("Enter the number of people: *"); 
fgets(tempStr, sizeof(tmpStr), stdin); 
numberOfPeople = atoi(tmpStr); 

numberOfPeople을 알았으므로 이름 포인터의 배열, 정수 배열 배열 및 가중치 정수 배열을 할당하십시오. 지금

for(i=0; i<numberOfPeople; ++i) 
    { 
    printf("Enter name #%d: ", i); 
    fgets(tmpStr, sizeof(tmpStr), stdin); 

메모리를 할당하고, :

names = malloc(numberOfPeople * sizeof(*names)); 
ages = malloc(numberOfPeople * sizeof(*ages)); 
weights=malloc(numberOfPeople * sizeof(*weights)); 

내가 (다시) 코드는 다양한 배열 요소를 사용자에게 물어 루프에 대한 같은 무언가를 가정 배열을 초기화하려면 입력 된 이름을 names 배열에 저장하십시오.

names[i] = strdup(tmpStr); 

'에서는 StrDup() 함수 호출되어'의 malloc() 내부적으로, 지정된 문자열 (tmpStr)를 저장하기에 충분한 메모리를 할당하는 단계; 문자열 (tmpStr)을 할당 된 메모리에 복사하고 할당 된 메모리의 주소를 반환합니다. 이것은 'names [i]'에 할당됩니다.

그런 다음 사용자의 나이를 얻을 :

printf("Enter age #%d: ", i); 
    fgets(tmp, sizeof(tmpStr), stdin); 

    ages[i] = atoi(tmpStr); 

그런 다음 수 ...

... 
관련 문제