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 );
}
上面的变量“result”的目的是什么?什么也没做。从 fgets 返回的指针存储在其中,但就是这样,它没有任何用处。
最佳答案
您应该测试该结果是否为 NULL,以检查 EOF 条件或错误,而不是仅仅忽略它。此外,通过不检查结果,您正在在线执行 strlen,这可能具有未初始化的数据,因为 fgets 失败。真的,你应该在 fgets 之后:
if (!result)
{
free(infoPtr); // To not leak the object allocated at the start
return NULL; // Function failed
}
如果第一个 fgets 成功而第二个失败,你可能仍然有泄漏,因为对结构的指针成员有额外的分配。不幸的是,由于该结构未初始化为零,因此您无法检查这些指针是否为 NULL。因此,或许使用 calloc 而不是 malloc 或至少将所有结构指针成员初始化为 NULL 会是一个更好的主意。
关于C fgets问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3926805/