[英]size_t cast in getline in C
我只是發現gets已被棄用,由於可靠性問題,不建議使用scanf,因此我正在嘗試getline()。
如果聲明了size_t變量並為其分配要使用的字節數,則可以使用getline而不出現問題。
我知道,如果我想讓getline進行memalloc,則必須將第二個參數(size_t *一個)賦為零,而char **賦為NULL。 它的工作原理是:
int main(){
int read;
size_t zero = 0;
char *A;
A=NULL;
printf("Write something:\n");
read=getline(&A, &zero, stdin);
if(read!= -1) puts(A);
return 0;
}
如果我為變量賦零,它會起作用,但是為什么不能不聲明變量並像這樣強制轉換為零(0):
int main(){
int read;
//size_t zero = 0;
char *A;
A=NULL;
printf("Write something:\n");
read=getline(&A, (size_t *)0, stdin);
if(read!= -1) puts(A);
return 0;
}
最后一個代碼編譯正常,但是getline返回-1,因此出錯。
因為&size
不是空指針。 它是包含 0
的對象的有效地址,該地址不同於指針為0
且無指向。
順便說一句, gets
已從C標准中刪除,但fgets
並未。 這是便攜式C的必經之路。
this is the correct way to use getline()
#include <stdio.h>
int main()
{
int bytes_read; // number of bytes actually read
int nbytes = 100; // max number of bytes to read
char *my_string; // ptr to byte read
puts ("Please enter a line of text.");
/* These 2 lines are the heart of the program. */
my_string = (char *) malloc (nbytes + 1);
if( NULL == my_string )
{ // then error occurred with malloc
perror( "malloc" );
exit(1);
}
// implied else
bytes_read = getline (&my_string, &nbytes, stdin);
if (bytes_read == -1)
{
puts ("ERROR!");
}
else
{
puts ("You typed:");
puts (my_string);
}
free( my_string );
return 0;
}
您可以查看getline()
的聯機幫助頁以獲得更好的理解。
正如功能原型所說
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
有兩種情況。
如果*lineptr
為NULL
,則getline()
本身將分配用於存儲行的緩沖區,該緩沖區需要由用戶釋放。 在這種情況下,由於*lineptr
為NULL
,因此緩沖區大小(由size_t *n
表示)及其忽略不重要。 getline()
處理內存分配。
如果在調用getline()
之前, *lineptr
包含指向分配給malloc()
緩沖區的指針 ,那么我們需要將緩沖區的大小告知getline()
,即*n
個字節。 如果緩沖區的大小不足以容納該行,則getline()
使用realloc()
調整其大小,並用新值更新*lineptr
和*n
。
所以,根據您的問題
如果聲明了size_t變量並為其分配要使用的字節數,則可以使用getline而不出現問題。
==> Number of bytes to use
應為已分配緩沖區的大小(如果已分配)。
我知道,如果我想讓getline進行memalloc,則必須將第二個參數(size_t *一個)賦為零,而char **賦為NULL。
==> *lineptr
應該為NULL,對。 *n
可以保留任何值,因為它將被忽略,但是n
應該是有效的指針[如size_t zero = 0;
和&zero
],而不是NULL
指針(例如,在(size_t *)0
情況下(size_t *)0
,因為成功調用getptr()
, *n
將被更新以反映分配的大小。
希望這可以幫助!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.