3
struct DVDInfo  *ReadStruct( void ) {
    struct DVDInfo  *infoPtr;
    int             num;
    char            line[ kMaxLineLength ];
    char            *result;

    infoPtr = malloc( sizeof( struct DVDInfo ) );

    if ( NULL == infoPtr ) {
        printf( "Out of memory!!!  Goodbye!\n" );
        exit( 0 );
    }

    printf( "Enter DVD Title:  " );
    result = fgets( line, kMaxLineLength, stdin );
    line[ strlen( line ) - 1 ] = '\0';
    infoPtr->title = MallocAndCopy( line );

    printf( "Enter DVD comment:  " );
    result = fgets( line, kMaxLineLength, stdin );
    line[ strlen( line ) - 1 ] = '\0';
    infoPtr->comment = MallocAndCopy( line );

    do {
        printf( "Enter DVD Rating (1-10):  " );
        scanf( "%d", &num );
        Flush();
    }
    while ( ( num < 1 ) || ( num > 10 ) );

    infoPtr->rating = num;

    printf( "\n----------\n" );

    return( infoPtr );
}

甚至有上面的变量“结果”的目的是什么?什么都没做。从 fgets 返回的指针存储在其中,但仅此而已,它没有任何用途。

4

3 回答 3

2

您应该测试该结果是否为 NULL,以检查 EOF 条件或错误,而不是仅仅忽略它。此外,通过不检查结果,您正在在线执行 strlen,这可能具有未初始化的数据,因为 fgets 失败。真的,你应该在 fgets 之后:

if (!result)
{
  free(infoPtr); // To not leak the object allocated at the start
  return NULL; // Function failed
}

如果第一个 fgets 成功而第二个 fgets 失败,您可能仍然有泄漏,因为对结构的指针成员有额外的分配。不幸的是,由于该结构没有初始化为零,因此您无法检查这些指针是否为 NULL。因此,也许使用 calloc 而不是 malloc 或至少将所有结构指针成员初始化为 NULL 会是一个更好的主意。

于 2010-10-13T18:32:05.097 回答
2

似乎有人开始实施错误检查,但最终搞砸了。返回值应与 比较NULL,如果相等则报告错误。

于 2010-10-13T18:32:57.670 回答
0

最有可能的是,编译器抛出了一个关于被忽略的函数返回值的警告。程序员并不关心 的返回值,fgets只是简单地添加了result =以使编译器不再唠叨它。正确的解决方案是检查返回值以确保函数成功完成。

于 2010-10-13T18:35:53.330 回答