簡體   English   中英

在C語言的getline中投放了size_t

[英]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);

有兩種情況。

  1. 如果*lineptrNULL ,則getline()本身將分配用於存儲行的緩沖區,該緩沖區需要由用戶釋放。 在這種情況下,由於*lineptrNULL ,因此緩沖區大小(由size_t *n表示)及其忽略不重要。 getline()處理內存分配。

  2. 如果在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM