2017-10-06 10 views
-1

http://man7.org/linux/man-pages/man3/getline.3.htmlgetline에서 버퍼의 포인트는 무엇입니까?

두 번째 매개 변수 size_t *n의 요점을 이해할 수 없습니다.

왜 입력 (예 : 표준 입력)과 출력 (일부 문자 배열) 사이에 버퍼가 필요합니까?

또한 예제에서는 size_t len = 0;을 제공합니다. 크기 0의 버퍼를 설정하는 것의 의미는 무엇입니까?

+0

두 번째 매개 변수는 읽은 데이터의 크기이며 제공 한 버퍼에서 읽는 데이터의 양 또는 버퍼를 할당 한 버퍼의 양을 알려줍니다. –

+0

@RetiredNinja : 아니요. 할당 된 버퍼의 크기입니다. 반환 값은 데이터의 길이입니다 (마지막에 null 바이트 제외). –

답변

1

getline()의 요점은받은 버퍼를 재 할당 할 수 있다는 것입니다.

는 발신자의 길이 n의 초기 buffer 공급

size_t n = some_value(); 
char *buffer = malloc(n); 
getline(&buffer, &n, stdin); 

하고 발신자를 감안할 때. getline()이 재 할당되면 buffer이 메모리를 가리 키도록 변경하고 n을 변경하여 새 길이를 기록합니다.

분명히, 이것은 realloc()buffer에 유효 할 수 있다고 가정하는, 즉 버퍼는 하나 또는 NULLmalloc(), calloc() 또는 realloc() 의해 리턴 된 값이다.

n을 0으로 설정하는 중요성 AND buffer에서 NULL까지는 getline()에게 버퍼가 없음을 알립니다. 따라서 아무 것도 읽지 않으면 getline()이 다시 할당됩니다.

이 모든 내용은 언급하신 링크에 실제로 설명되어 있습니다.

+0

감사합니다. 하나의 마지막 질문이지만, 어떤 크기 단위가 n으로 전달됩니까? n = 1이면 1 바이트의 메모리가 할당됩니까? –

+0

'sizeof'가 반환하고'malloc()'이 걸리는 것처럼 바이트입니다. – Barmar

+0

@ C.Buffer 링크 된 맨 페이지에 다음과 같이 쓰여 있습니다 :'* n bytes in size' – Barmar

0

getline()은 배열이 사용자가 입력 한 행을 포함 할만큼 충분히 큰지 알아야합니다. n 매개 변수에서 배열의 현재 크기를 가져옵니다. 배열의 크기가 충분하지 않으면 필요한 크기로 배열을 다시 할당합니다. 그런 다음 *lineptr*n을 새 배열과 크기로 업데이트합니다. *n을 업데이트하면 발신자가 나중에 사용하기 위해 배열의 크기를 알 수 있습니다 (예 : 루프에서 getline()을 호출하는 경우).

C 포인터는 포인터가 가리키는 배열의 크기를 포함하지 않는다는 것을 기억하십시오. 함수가이를 알아야 할 경우 매개 변수로 전달해야합니다.