2012-10-18 3 views
4

4 개의 정수로 구성된 전역 구조체 (배열)를 식별해야합니다. 문제는 구조체 배열의 크기를 미리 알 수 없다는 것입니다.C에서 전역 구조체 포인터를 정의합니까?

나는 sth를 만들려고 노력하고 있습니다. 이런 식으로 :

typedef struct 
{ 
    int value; 
    int MAXleft; 
    int MAXright; 
    int MAX; 
} strnum; 

int main() 
{ 
    int size; 
    scanf("%d", &size); 

    strnum numbers[size]; 

    return 0; 
} 

나는 포인터를 사용하여이를 수행 할 수 있지만 어떻게 해야할지를 모른다는 말을 들었다.

또한
strnum* number; 
    int size = 0; 

    scanf("%d",&size); 

    number = malloc(size * sizeof(strnum)); 

, 당신은 배열을 사용하여 수행 한 후 메모리를 해제하는 것을 잊지 마세요 :

답변

5

동적으로이 같은 여러 구조의 공간을 할당 할 수 있습니다

strnum *numbers = malloc(size * sizeof(strnum)); 

그런 다음 당신이 어떤 규칙적인 배열 (대부분)처럼 사용할 수 있습니다.

malloc 대신 calloc을 사용하는 것이 더 편리 할 수 ​​있습니다. 여러 블록을 할당하고 0으로 채 웁니다. malloc은 할당 된 메모리를 지우지 않습니다. 당신은 메모리 관리자에 다시 할당 된 메모리를 반환하는, free(numbers)를 호출하는 것을 잊지 마세요와 메모리 완료

strnum *numbers = calloc(size, sizeof(strnum)); 

.

free 더 이상 필요하지 않게되고 더 이상 할당하지 않으면 프로그램이 계속 작동하면서 별다른 이유없이 프로그램의 메모리 사용 공간이 커집니다. 이를 메모리 누수라고하며 피해야합니다. 결국 프로그램에 대한 메모리 부족과 예기치 않은 결과를 초래할 수 있습니다.

그리고 메모리 할당 기능의 프로토 타입과 함께 stdlib.h 헤더를 포함하는 것을 잊지 마십시오.

0

는 그것은

다음과 같이 할 수있는 일을하려고하는 것은 Dynamic Memory Allocation라고합니다.

free(number); 
+0

C에서 malloc이 반환하는 것을 캐스트하지 않습니다. 프로토 타입이 int 인 경우 기본적으로 반환 유형 이후 stdlib.h를 포함하는 것을 잊어 버리면 문제가 발생할 수 있습니다. 캐스팅하지 않으면 당신은 그것을 잡을 것입니다. –

+0

올바른 메모리 양을 할당하면'malloc'의 형 변환에 차이가 있다고 생각하지 않습니다. – sgarizvi

+3

누군가 32 비트 PC에서 malloc 결과의 캐스트를 작성한 프로그램을 컴파일하고 8 바이트 포인터와 4 바이트 int가있는 64 비트 시스템이있는 시스템에서 실행하려고하면 후자가 효과가없는 이유를 이해하려고 정말로 힘든 시간을 보냅니다. 문제는 프로토 타입이 없으면 반환 값이 4 바이트 int로 잘리고 segfault가 발생할 가능성이 높다는 것입니다. –

0

크기가 계속 증가하면 malloc()으로 시작한 다음 realloc()을 수행 할 수 있습니다. realloc()에 대한 호출 수가 줄어들도록 한 번에 10 개의 구조 풀을 할당 할 것을 제안합니다.

관련 문제