반환된 변수의 기억을 자유롭게 하는 적절한 방법
저는 사용자 입력을 받도록 설계된 기능을 만들었습니다.메모리를 사용자 입력을 유지하는 변수에 할당해야 하지만 해당 변수는 함수가 끝날 때 반환됩니다.할당된 메모리를 해제하고 변수 값을 반환하는 적절한 방법은 무엇입니까?
코드는 다음과 같습니다.
char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;
while((c = getchar()) != '\n' && c != EOF) {
input[i++] = c;
}
return input;
입력한 주소를 반납하고 사용 후 자유롭게 하면 되나요?
입력 변수를 자유롭게 할 수 있는 가장 적절한 방법이 무엇인지 궁금합니다.
아주 간단해요, 당신이 아이들에게 전달하기만 하면요.free()
에 의해 반환된 것과 같은 지시자.malloc()
괜찮아.
예를들면
char *readInput(size_t size)
{
char *input;
int chr;
input = malloc(size + 1);
if (input == NULL)
return NULL;
while ((i < size) && ((chr = getchar()) != '\n') && (chr != EOF))
input[i++] = chr;
input[size] = '\0'; /* nul terminate the array, so it can be a string */
return input;
}
int main(void)
{
char *input;
input = readInput(100);
if (input == NULL)
return -1;
printf("input: %s\n", input);
/* now you can free it */
free(input);
return 0;
}
당신이 절대로 해서는 안되는 것은 마치
free(input + n);
왜냐면input + n
는 포인터가 반환되지 않습니다.malloc()
.
하지만 당신의 코드는 당신이 처리해야 할 다른 문제들이 있습니다.
에 대한 공간을 할당하고 있습니다.
MAX_SIZE
char
s 그래서 당신은 곱해야 합니다.sizeof(char)
어느 것이1
, 대신에sizeof(char *)
할당할 수 있는 것은MAX_SIZE
당신이 만들 수 있는 포인터들과MAX_SIZE
대신 함수 매개 변수입니다. 고정 버퍼를 할당하는 경우 배열을 정의할 수 있기 때문입니다.main()
크기가 큰MAX_SIZE
맘에 들다char input[MAX_SIZE]
, 그것을 에 전합니다.readInput()
매개변수로서, 따라서 피함.malloc()
그리고.free()
.그만큼 많은 공간을 할당하고 있지만 사용자의 공간에 오버플로가 발생하지 않습니다.
while
루프, 당신은 그것을 확인해야 합니다.i < MAX_SIZE
.
반환 유형으로 함수를 작성할 수 있습니다.char*
,돌아가다input
, 사용자에게 전화를 걸라고 요청합니다.free
데이터를 다 쓰고 나면 말입니다
또한 사용자에게 버퍼 크기 제한과 함께 적절한 크기의 버퍼를 직접 전달하고 버퍼에 쓴 문자 수를 반환하도록 요청할 수도 있습니다.
이것은 전형적인 c 케이스입니다.함수 mallocs는 결과를 위해 메모리를 저장합니다. 호출자는 반환된 값을 확보해야 합니다.당신은 지금 c 메모리 유출의 살얼음 위를 걷고 있습니다. 두가지 이유.
첫째, 무료 요구사항을 실행 가능한 방식으로 전달할 수 있는 방법이 없습니다(즉, 컴파일러나 런타임은 사용자에게 도움이 되지 않습니다). 인수 유형을 지정하는 것과 대조됩니다.어딘가에 문서화해서 발신자가 당신의 문서를 읽기만 하면 됩니다.
둘째: 발신자가 실수할 수 있는 결과를 자유롭게 하는 것을 알더라도 일부 오류 경로를 선택하여 메모리를 자유롭게 하지 못합니다.이것은 즉각적인 오류를 일으키지 않으며, 문제가 해결되는 것처럼 보이지만, 3주 동안 실행된 후에 메모리가 부족해진 후에 앱이 다운됩니다.
이것이 많은 '현대' 언어들이 이 주제에 집중하는 이유입니다. c++ 스마트 포인터, 자바, C# 등 가비지 컬렉션...
언급URL : https://stackoverflow.com/questions/29655051/proper-way-to-free-memory-of-a-returned-variable
'it-source' 카테고리의 다른 글
스프링 프로토타입 범위 - 사용 사례? (0) | 2023.11.02 |
---|---|
유연한 어레이 멤버로 인해 정의되지 않은 동작이 발생할 수 있습니까? (0) | 2023.11.02 |
어린이 중 한 명이 포커스를 받을 경우 블러 이벤트가 발생하지 않도록 합니다. (0) | 2023.11.02 |
Using RepositoryRestResource annotation to change RESTful endpoint not working (0) | 2023.11.02 |
인수 배열을 Powershell 명령줄에 전달하는 방법 (0) | 2023.11.02 |