2017-10-06 160 views
-1

http://man7.org/linux/man-pages/man3/getline.3.htmlgetline中的緩衝點是什麼?

我不明白第二個參數size_t *n的要點。

爲什麼你需要輸入(例如stdin)和輸出(某些字符數組)之間的緩衝區。

另外,在它們提供的示例中,size_t len = 0;。設置大小爲0的緩衝區的意義是什麼?

+0

第二個參數是讀取數據的大小,它告訴您從您提供的緩衝區中讀出多少數據,或者它爲您分配的緩衝區。 –

+0

@RetiredNinja:不是真的;它是分配的緩衝區的大小。返回值是數據的長度(不包括結尾的空字節)。 –

回答

1

getline()的要點是它可以重新分配它接收的緩衝區。

給定呼叫者做

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

呼叫者提供長度n的初始buffer。如果getline()重新分配,它將更改buffer,以便它指向內存,並更改n以記錄新的長度。

顯然,這假定它是有效的做realloc()buffer上即該緩衝液是NULL或是malloc()calloc(),或realloc()返回的值。

n設置爲零的意義並且bufferNULL告訴getline()它沒有被賦予緩衝區。因此,如果它讀取任何東西,getline()將因此重新分配。

所有這些實際上都是在您提到的鏈接中描述的。

+0

謝謝。最後一個問題,單位通過n的大小是多少?如果n = 1,是否分配了1個字節的內存? –

+0

它是字節,就像'sizeof'返回和'malloc()'一樣。 – Barmar

+0

@ C.Buffer它在你鏈接到的手冊頁中說:'* n字節的大小' – Barmar

0

getline()需要知道數組是否足夠大以容納用戶輸入的行。它從n參數獲取數組的當前大小。如果數組不夠大,則將其重新分配爲所需的大小。然後它將*lineptr*n更新爲新的陣列和大小。更新*n允許調用者知道該陣列在將來使用時有多大(例如,在示例中,在循環中調用getline())。請記住,C指針不包括它們指向的數組的大小。如果一個函數需要知道這個,它必須作爲參數傳遞。