size_t在C中的getline中强制转换

时间:2014-10-29 20:16:17

标签: c getline size-t

我刚刚发现不推荐使用gets,并且由于可靠性问题,不推荐使用scanf,因此我尝试使用getline()。

如果我声明一个size_t变量并为其分配要使用的字节数,我可以毫无问题地使用getline。

据我所知,如果我想让getline到memalloc,我必须将第二个参数(size_t * one)设置为零,将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,所以出错。

3 个答案:

答案 0 :(得分:1)

因为&size不是空指针。它是包含 0的对象的有效地址,它与指针0不同并指向无处。

BTW,gets已从C标准中删除,但fgets未被删除。这是便携式C的方法。

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

您可以查看getline()的{​​{3}}以更好地理解。

正如函数prototye所说

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

    < / LI>

    所以,根据你的问题

      

    如果我声明一个size_t变量并为其分配要使用的字节数,我可以毫无问题地使用getline。

    ==&GT; Number of bytes to use应该是已分配缓冲区的大小(如果已分配)。

      

    据我所知,如果我想让getline到memalloc,我必须将第二个参数(size_t * one)设为零,将char **设为NULL。

    ==&GT; *lineptr应为NULL,对。 *n可以保留任何值,因为它会被忽略,但n应该是一个虚拟指针[如size_t zero = 0;&zero],而不是{{1}指针[如NULL的情况],因为在成功调用(size_t *)0后,getptr()将更新以反映分配的大小。

    希望这会有所帮助!!