2010-11-21 14 views
6

전역으로 만들고자하는 배열이 있는데 함수 호출에서 초기화하려고합니다. 내가 먼저 그것의 크기 모르게 선언 할 :C - 함수에서 전역 배열 초기화

char str[]; 

를 나중에 초기화 :

str = char[size]; 

내가 어떻게 할 수 있습니까? 저는 C에 매우 익숙합니다. 아마도 여기서 완전히 잘못된 길로 가고있을 것입니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

7

할 방법은 malloc입니다. 우선 단지 포인터를 선언

char *str; 

을 다음 init 함수 당신 malloc 그 안에 :

str = malloc(sizeof(*str) * size_of_array); 

이 그 str 포인트 (이 경우 char)의 크기의 size_of_array 요소를 할당합니다. 할당이 실패 할 경우

당신은 확인해야합니다 :

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

는 일반적으로 당신이 그것을 완료하면 반드시 free이 할당 된 메모리를 확인해야합니다. 그러나이 경우 str은 전역이므로 범위를 벗어나지 않으며 프로그램이 종료되면 메모리는 free d가됩니다.

+4

당신이 정말로의 malloc의 결과를 캐스팅하지 않아야을 - 당신 C++에서 실제로 그렇게 할 필요가 있습니다 - 유용한 경고를 다룰 수 없기 때문에 C 언어에서는 피해야합니다. –

+2

일반적인 경우,'sizeof (* str)'을 사용하면 타입 이름을 반복하지 않아도됩니다. 게다가, C에서 malloc의 결과를 캐스팅해서는 안됩니다. –

+2

@Paul, @Ben : 감사합니다. anwer를 업데이트했습니다. –

1
char* str; 

str = (char*)malloc(size*sizeof(char)); 

당신은 정의에 의해 sizeof(char) == 1 이후 *sizeof(char)를 건너 뛸 수 있습니다.

free

+2

일반적으로 사용하려면'sizeof (* str)'을 사용하십시오. 따라서 형식 이름을 반복하지 않아도됩니다. 게다가, C에서 malloc의 결과를 캐스팅해서는 안됩니다. –

+1

C에서 정말 malloc의 결과를 캐스팅해서는 안됩니다. C++에서만 그렇게해야합니다. 유용한 경고를 숨길 수 있으므로 C 언어에서는 피해야합니다. –

1

대신 배열의 char* str; 만들기 사용하여 메모리 할당을 해제하는 것을 잊지 마십시오. 그런 다음 malloc 또는 calloc을 사용하여 필요한 메모리 양을 할당하고 함수 호출 자체에서 초기화를 수행하십시오. 당신의 초기화 함수에서 다음

char *str = NULL; 

이 같은 것을 할 :

2

는 전역 배열 선언은 다음과 같이 확인 C에서

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof (char)'는 정의상 1입니다. 어떤 타입 으로든 작동하는 코드를 작성하려면'sizeof (* str)'을 사용하십시오. –

+0

@Ben : true이지만 형식에 관계없이'sizeof'를 포함하는 것이 좋은 습관입니다.나는'sizeof (* str)'에 대한 찬성론을 잘 알고 있지만이 경우에는'sizeof (char)'를 더 선호한다. –