2016-01-13 63 views
0

我试图分配一个多维数组从文件中读取信息,然后打印出来,以检查它是否工作正常,之后获得阵列信息的二维数组(还没做完)。但由于某些原因,它给了我段错误,并返回139(0x8B),当我运行它,当我尝试调试它,它打印的一切,但在最后它说,它无法打开文件:LIB-start.c。先谢谢你!多维数组段错误和139(0x8B)返回

#include <stdio.h> 
    #include <stdlib.h> 
    #include <ctype.h> 

    int ***getFileLoad (char *nomeFicheiro); 
    int ***InitArray (int ***array, int cells); 
    void freeArray(int ***array, int cells); 

    int main() { 

    int ***intArray=NULL, intCells; 
    char strNome[10], *p2String=NULL; 

    printf("Nome ficheiro: "); 
    scanf("%s", strNome); 

    p2String=strNome; 

    intArray=getFileLoad(p2String); 

    intCells=intArray[1][0][0]; /*intCells+2 -> nr of lines to read from the file*/ 

    freeArray(intArray, intCells); 

    return 0; 
} 

int ***getFileLoad (char *nomeFicheiro) { 

    char strLines[5], strColumns[5], strCells[5], strTemp[3]; 
    int i=0, j=0, k=0, b=2, lines=0, columns=0, cells=0, intTemp=0; 
    int ***array=NULL; 
    FILE *ficheiro=NULL; 

    ficheiro=fopen(nomeFicheiro, "r"); /*open file*/ 

    if (ficheiro==NULL) { 
     printf("Erro ao abrir o ficheiro!\n"); 
     exit(EXIT_FAILURE); 
    } 

    fscanf(ficheiro, "%s %s %s", strLines, strColumns, strCells); 

    if ((lines=atoi(strLines))<=0) {  
     printf("Invalid nr of lines!\n"); 
     exit(EXIT_FAILURE); 
    } 

    if ((columns=atoi(strColumns))<=0) {  
     printf("Invalid nr of columns!\n"); 
     exit(EXIT_FAILURE); 
    } 

    if ((cells=atoi(strCells))<=0) { 
     printf("Invalid nr of cells!\n"); 
     exit(EXIT_FAILURE); 
    } 

    array=InitArray(&array, cells); 

    array[0][0][0]=lines; 
    array[0][1][0]=columns; 
    array[1][0][0]=cells; 


    for (i=2 ; i<cells+b ; i++) {  /*nr of lines to read*/ 
     for (j=0 ; j<1 ; j++) {   /*last value*/ 
      for (k=0 ; k<4 ; k++) {  /*middle value*/ 
       if (k==3) {    /*check if there is something else that I don't want on the Array*/ 
        intTemp=fgetc(ficheiro); 
        if (intTemp=='\n' || intTemp==EOF) { 
         continue; 
        } else { 
         while(intTemp!='\n' || intTemp!=EOF) { 
          intTemp=fgetc(ficheiro); 
          if (intTemp=='\n' || intTemp==EOF) { 
           break; 
          } 
         } 
        } 
       } else { 
        fscanf(ficheiro, "%s", strTemp); 

        if (isdigit(strTemp)) { 
         intTemp=atoi(strTemp); 
         if (k==0) {    /*accepts lines between 1->lines*/ 
          if (!(intTemp>=1 && intTemp<lines)) { 
           printf("Invalid values!\n"); 
           exit(EXIT_FAILURE); 
          } else { 
          array[i][k][j]=intTemp; 
          } 
         } else if (k==1) {  /*accepts columns between 1->columns*/ 
          if (!(intTemp>=1 && intTemp<columns)) { 
           printf("Invalid values!\n"); 
           exit(EXIT_FAILURE); 
          } else { 
          array[i][k][j]=intTemp; 
          } 
         } else if (k==2) {  /*accepts cells with values between 0->2*/ 
          if (!(intTemp>=0 && intTemp<3)) { 
           printf("Invalid values!\n"); 
           exit(EXIT_FAILURE); 
          } else { 
          array[i][k-1][j+1]=intTemp; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    intTemp=fgetc(ficheiro); /*checking for EOF*/ 

    if (intTemp!=EOF) { 
     printf("EOF not detected!\n"); 
     exit(EXIT_FAILURE); 
    } 

    fclose(ficheiro); 

    return array; 
} 

int ***InitArray (int ***array, int cells) { 

    int b=2, i=0, j=0, k=0 , l=0; 

    array=(int ***)malloc((cells+b)* sizeof(int**)); /*allocating 3D array*/ 

    if (array==NULL) { 
     printf("Not enough memory!\n"); 
     exit(EXIT_FAILURE); 
    } 

    for(i=0 ; i<cells+b ; i++) { 
     (array)[i]=(int **)malloc(b* sizeof(int*)); 

     if ((array)[i]==NULL) { 
      printf("Not enough memory!\n"); 
      for (j=0 ; j<i ; j++) { 
       free((array)[j]); 
      } 
      free(array); 
      array=NULL; 
      exit(EXIT_FAILURE); 
     } 


     for (j=0 ; j<b ; j++) { 
      (array)[i][j]=(int*)malloc(b*sizeof(int)); 

      if ((array)[i][j]==NULL) { 
      printf("Not enough memory!\n"); 
      for (k=0 ; k<i ; k++) { 
       for (l=0 ; l<j ; l++) { 
        free((array)[k][l]); 
       } 
      } 
      free(array); 
      array=NULL; 
      exit(EXIT_FAILURE); 
      } 
     } 
    } 

    return array; 
} 

void freeArray(int ***array, int cells) { 

    int i, j, b=2; 

    for (i=0 ; i<cells+b ; i++) { 
     for (j=0 ; j<b ; j++) { 
      free((array)[i][j]); 
     } 
     free((array)[i]); 
    } 
    free(array); 
    array=NULL; 

} 

文件例如:

​​
+2

'intArray = getFileLoad(p2String);'是吗?一个'int'返回到'int ***'? –

+0

请发布[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

@SouravGhosh,是我不好...... uptading它 – Slyer

回答

0

该项目工程在我的系统上罚款:的Linux Fedora的22克++ 5.1.1 没有段错误

我还检查了内存泄漏和无效的内存访问使用的valgrind

valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./StackQuestion 

(抑制:0 0)

==6904== LEAK SUMMARY: 
==6904== definitely lost: 0 bytes in 0 blocks 
==6904== indirectly lost: 0 bytes in 0 blocks 
==6904==  possibly lost: 0 bytes in 0 blocks 
==6904== still reachable: 72,704 bytes in 1 blocks 
==6904==   suppressed: 0 bytes in 0 blocks 
==6904== 
==6904== For counts of detected and suppressed errors, rerun with: -v 
==6904== ERROR SUMMARY: 0 errors from 0 contexts 

,指出没有无效访问已作出并且只有一个无害的内存泄漏(无害,因为操作系统会在进程终止时正确地记录内存)。

关于lib_start我的猜测是,你在GDB设置一个断点,或者您正试图调试)读取上的文件/写一些函数基本上都是非可调试为已读(或其他功能。这些函数需要内核帮助来做这种事情(显然GDB无法调试)。

我想我们需要更多的信息来重现奇怪的行为,为g ++优化版本,操作系统和传递给程序的文件。

+0

现在就工作!和你一样使用Valgrind,它给了我一个关于isdigit(strTemp)的错误。 谢谢你! – Slyer

+0

哦,但我很难很明显,有2个错误。 isdigit应该与stoi一起使用,并且initarray的参数是错误的。很高兴它有帮助。请将问题标记为已回答。 –