전역으로 만들고자하는 배열이 있는데 함수 호출에서 초기화하려고합니다. 내가 먼저 그것의 크기 모르게 선언 할 :C - 함수에서 전역 배열 초기화
char str[];
를 나중에 초기화 :
str = char[size];
내가 어떻게 할 수 있습니까? 저는 C에 매우 익숙합니다. 아마도 여기서 완전히 잘못된 길로 가고있을 것입니다. 어떤 도움이라도 대단히 감사하겠습니다.
전역으로 만들고자하는 배열이 있는데 함수 호출에서 초기화하려고합니다. 내가 먼저 그것의 크기 모르게 선언 할 :C - 함수에서 전역 배열 초기화
char str[];
를 나중에 초기화 :
str = char[size];
내가 어떻게 할 수 있습니까? 저는 C에 매우 익숙합니다. 아마도 여기서 완전히 잘못된 길로 가고있을 것입니다. 어떤 도움이라도 대단히 감사하겠습니다.
할 방법은 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가됩니다.
char* str;
str = (char*)malloc(size*sizeof(char));
당신은 정의에 의해 sizeof(char) == 1
이후 *sizeof(char)
를 건너 뛸 수 있습니다.
는 free
일반적으로 사용하려면'sizeof (* str)'을 사용하십시오. 따라서 형식 이름을 반복하지 않아도됩니다. 게다가, C에서 malloc의 결과를 캐스팅해서는 안됩니다. –
C에서 정말 malloc의 결과를 캐스팅해서는 안됩니다. C++에서만 그렇게해야합니다. 유용한 경고를 숨길 수 있으므로 C 언어에서는 피해야합니다. –
대신 배열의 char* str;
만들기 사용하여 메모리 할당을 해제하는 것을 잊지 마십시오. 그런 다음 malloc 또는 calloc을 사용하여 필요한 메모리 양을 할당하고 함수 호출 자체에서 초기화를 수행하십시오. 당신의 초기화 함수에서 다음
char *str = NULL;
이 같은 것을 할 :
는 전역 배열 선언은 다음과 같이 확인 C에서
void init(int size)
{
...
str = malloc(size * sizeof(char));
...
}
'sizeof (char)'는 정의상 1입니다. 어떤 타입 으로든 작동하는 코드를 작성하려면'sizeof (* str)'을 사용하십시오. –
@Ben : true이지만 형식에 관계없이'sizeof'를 포함하는 것이 좋은 습관입니다.나는'sizeof (* str)'에 대한 찬성론을 잘 알고 있지만이 경우에는'sizeof (char)'를 더 선호한다. –
당신이 정말로의 malloc의 결과를 캐스팅하지 않아야을 - 당신 C++에서 실제로 그렇게 할 필요가 있습니다 - 유용한 경고를 다룰 수 없기 때문에 C 언어에서는 피해야합니다. –
일반적인 경우,'sizeof (* str)'을 사용하면 타입 이름을 반복하지 않아도됩니다. 게다가, C에서 malloc의 결과를 캐스팅해서는 안됩니다. –
@Paul, @Ben : 감사합니다. anwer를 업데이트했습니다. –