http://man7.org/linux/man-pages/man3/getline.3.htmlgetline中的緩衝點是什麼?
我不明白第二個參數size_t *n
的要點。
爲什麼你需要輸入(例如stdin)和輸出(某些字符數組)之間的緩衝區。
另外,在它們提供的示例中,size_t len = 0;
。設置大小爲0的緩衝區的意義是什麼?
http://man7.org/linux/man-pages/man3/getline.3.htmlgetline中的緩衝點是什麼?
我不明白第二個參數size_t *n
的要點。
爲什麼你需要輸入(例如stdin)和輸出(某些字符數組)之間的緩衝區。
另外,在它們提供的示例中,size_t len = 0;
。設置大小爲0的緩衝區的意義是什麼?
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
設置爲零的意義並且buffer
到NULL
告訴getline()
它沒有被賦予緩衝區。因此,如果它讀取任何東西,getline()
將因此重新分配。
所有這些實際上都是在您提到的鏈接中描述的。
getline()
需要知道數組是否足夠大以容納用戶輸入的行。它從n
參數獲取數組的當前大小。如果數組不夠大,則將其重新分配爲所需的大小。然後它將*lineptr
和*n
更新爲新的陣列和大小。更新*n
允許調用者知道該陣列在將來使用時有多大(例如,在示例中,在循環中調用getline()
)。請記住,C指針不包括它們指向的數組的大小。如果一個函數需要知道這個,它必須作爲參數傳遞。
第二個參數是讀取數據的大小,它告訴您從您提供的緩衝區中讀出多少數據,或者它爲您分配的緩衝區。 –
@RetiredNinja:不是真的;它是分配的緩衝區的大小。返回值是數據的長度(不包括結尾的空字節)。 –