在c中打印字符串数组的第一个元素时出现分段错误

时间:2013-11-27 12:10:21

标签: c segmentation-fault malloc realloc

我正在扫描文本文件中的行并将元素放入特定的数组中,sscanf工作正常并将变量插入到数组中但是打印出字符串数组的第一个元素会导致分段错误(打印适用于其他数组的第一个元素和对于字符串数组中的rest元素

这是我的代码:

char **shipTable = NULL;
char *notimportant;
double *dirTable;
double *numTable;
double *speedTable;
double *latTable;
double *lngTable;

void scanShips(){
   char fname[30];
   char line[150];
   char shipname[10];
   double lat;
   double lng;
   double speed;
   double dir;
   int numofShips;
   numofShips=1;
   FILE *myfile;



   printf("give file name containing ships /n");
   scanf("%s",fname);
   myfile = fopen(fname,"rt");
   fgets(line,80,myfile);
   sscanf(line, "%d %d %d %d %d %d", &day, &month, &year, &h, &min, &sec);

   while ( fgets( line,100,myfile) != 0 ) {
       sscanf(line, "%s %lf %lf %lf %lf", shipname, &lat, &lng, &dir, &speed);
       printf("%s",shipname);
       printf("\n");

       shipTable = realloc( shipTable, numofShips*sizeof(char*) );
       latTable = realloc( latTable, numofShips*sizeof(double) );
       lngTable = realloc( lngTable, numofShips*sizeof(double) );
       dirTable = realloc( dirTable, numofShips*sizeof(double) );
       speedTable = realloc( speedTable, numofShips*sizeof(double) );
       shipTable[numofShips-1]=malloc((10)*sizeof(char));


       strcpy (shipTable[numofShips-1],shipname);
       dirTable[numofShips-1]=dir;
       speedTable[numofShips-1]=speed;
       latTable[numofShips-1]=lat;
       lngTable[numofShips-1]=lng;

       numofShips++;
   //printf("%d",numofShips);

    }
    fclose ( myfile);

//note:
printf("%s",shipTable[0]);//<---Segmentation fault
printf("%s",shipTable[1]);//<---Perfectly fine, as well as rest fo the array
printf("%f",dirTable[0]);//<---Perfectly fine, as well as rest of "double" arrays

示例文件:
13 11 2011 13 04 00
GW1927 52.408 -4.117 1.000 0.000
GS452 51.750 -4.300 5.000 10.000
EI597 52.100 -6.000 90.000 12.000
EI600 52.000 -5.900 10.000 15.000
EI601 54.000 -5.900 10.000 15.000

船名长度永远不会超过9个字符。

1 个答案:

答案 0 :(得分:0)

您的计划不完整。完成后(通过添加必要的#include,定义daymonth等),它可以编译并正常工作。

结论:你没有告诉我们整个故事,而且这个错误出现在你没有展示的代码中。