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返回的指针被存储在其中,但仅此而已,它没有任何用途。
发布于 2010-10-14 02:32:05
您应该测试结果是否为空,以检查EOF条件或错误,而不是忽略它。此外,通过不检查结果,您正在执行一个strlen on line,这可能具有未初始化的数据,因为fgets失败。真的,你应该有,在fgets之后:
if (!result)
{
free(infoPtr); // To not leak the object allocated at the start
return NULL; // Function failed
}如果第一个fget成功,第二个失败,你可能仍然会有泄漏,因为有额外的分配给结构的指针成员。不幸的是,因为结构没有初始化为零,所以您不能检查这些指针是否为空。因此,也许使用calloc而不是malloc,或者至少将所有结构指针成员初始化为NULL,可能会是一个更好的想法。
发布于 2010-10-14 02:32:58
似乎有人开始实现错误检查,但最终搞砸了。返回值应该与NULL进行比较,如果相等则报告错误。
发布于 2010-10-14 02:35:53
最有可能的是,编译器抛出了一个关于被忽略的函数返回值的警告。程序员并不关心fgets的返回值,而只是简单地添加到result =中,以使编译器不再纠结于此。正确的解决方案应该是检查返回值,以确保函数成功完成。
https://stackoverflow.com/questions/3926805
复制相似问题