我非常想了解我的C编程技能,所以我开始了自己的自我训练程序,试图读取文件并将其内容插入不同的数据结构中。在这里,我想专门使用一个动态分配的指针数组。我已经在另一个类似的程序中成功实现了getc(),但是通过使用静态数组来实现,因此我非常想在这里继续使用getc()函数。因此,在此新实现中,我只是尝试将输入文件中的所有字符插入到数组中,该数组是使用malloc()初始化的。一次读取一个字符后,我尝试每次将指针数组的大小调整为一个字符的大小,以便在下一次迭代中为下一个字符留出空间。然后,随后,通过新的指针数组迭代[逐个字符],并简单地打印出所有内容。但是,我收到分段错误,所以也许我会为此出错一些吗?非常感谢您的任何反馈...谢谢!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main( int argc, char *argv[] )
{
FILE *filePointer;
int c, i;
char *input_arrayPointer;
input_arrayPointer = ( char* ) calloc ( 1, sizeof( char ) );
printf("%p\n", input_arrayPointer);
int filled_elements = 0;
filePointer = fopen( argv[1], "r" );
if ( argc > 2 )
{
printf( "\nIncorrect usage, please say...\nRunProgram *filename*\n\n" );
exit( 1 );
}
if ( filePointer != NULL )
{
while ( ( c = getc( filePointer ) ) != EOF )
{
// filled_elements, to start, is 0
*( input_arrayPointer + filled_elements ) = c;
filled_elements++;
input_arrayPointer = ( char* ) realloc ( input_arrayPointer, (filled_elements * sizeof( char ) ) );
}
}
fclose( filePointer );
for ( i = 0; i < filled_elements; i++, input_arrayPointer++ )
{
printf("%c", *( input_arrayPointer + filled_elements );
}
}
输入
while ( ( c = getc( filePointer ) ) != EOF )
{
// filled_elements, to start, is 0
*( input_arrayPointer + filled_elements ) = c;
filled_elements++;
input_arrayPointer = ( char* ) realloc ( input_arrayPointer, (filled_elements * sizeof( char ) ) );
}
第一次迭代会发生什么?
input_arrayPointer
是一个字节大]filled_elements
为0input_arrayPointer
递增filled_elements
被调用为realloc
个字节...即1 !!!没有数组大小增加!您只需要再分配一个字节
filled_elements
Better:始终检查realloc返回值。并使用临时指针以避免在这种情况下丢失原始指针。像这样的东西:
input_arrayPointer = ( char* ) realloc ( input_arrayPointer, ((filled_elements+1) * sizeof( char ) ) );