2016-06-15 118 views
-1

我在C中编写了一个semestral工作,但我无法在这里认识到这个问题。当我在调试中运行代码时,它给我一个分段错误。我不确定有什么问题。以前我把记忆分配给poleNazvu,但不是分段错误,而是让我“试图释放非堆对象”,所以这不是一种方法。请告诉我如何处理分段错误。它发生在我strcpy(poleNazvu ...)的行中,我在代码中标记了它。 ALOKACE_POLI = 200; ALOKACE_MALA = 20;它做的是,它需要一个“约翰500”和levaStrana获得“约翰”,而pravaStrana获得“500”所以我试图将levaStrana复制到poleNazvu和pravaStrana到poleKreditu。在这段代码的末尾,snip是分段错误。strcpy出现分割错误

void menuHighlights(void)            //menu se zebricky uzivatelu 
{ 
    char vyber3, * poleNazvu[ALOKACE_POLI][ALOKACE_MALA],line[ALOKACE_LINE]; 
    char * prohodJmeno, * menic, * separator, * levaStrana, * pravaStrana; 
    int poleKreditu[ALOKACE_POLI], count=0, countMax=0, prohodCislo, d; 
    FILE *NACTENI; 
    //int alokace1=0, alokace2=0;              //vytvoreni promenne pro soubor 


    fflush(stdin);              //vyprazdneni bufferu 
    system("cls");              // vycisteni obrazovky 
    printf("\nZebricek nejlepsich hracu:\n");            //tisk hlavicky 
    fflush(stdin);              //buffer 
    NACTENI = fopen(SOUBOR_HRACU , "r");         //ulozeni otevreneho souboru do promenne 
    if(NACTENI == NULL) {           //jestlize v promenne nic neni 
     perror("Soubor nenalezen.");         //vypis error 
     Sleep(HODNOTA_BIG_SLEEP);             //nech uzivatel aby si to precetl 
     exit(1); //a pak ukonci seanci 
    } 

    while (fgets(line, sizeof line, NACTENI) != NULL) {     //pokud radek nacteny ze souboru nebude prazdny 
     fflush(stdin);             //buffer 
     menic=line;              //anti-decay opatreni promenne line 
     separator = " "; 
     levaStrana = strtok(menic, separator); 
     pravaStrana = strtok(NULL, ""); 
     //if ((poleNazvu[count][ALOKACE_MALA-1]=(char *)malloc(ALOKACE_PROHAZOVANI*sizeof(char)))==NULL) { 
     // printf("Nedostatek pameti. Ukoncuji."); 
     // exit(1); 
     //} 
     //alokace1=1; 
     strcpy(poleNazvu[count][ALOKACE_MALA-1],levaStrana); //ITS HERE 
     poleKreditu[count]=atoi(pravaStrana); 
     if (countMax<count) { 
      countMax=count; 
     } 
     count++; 
    } 
+2

不做'fflush(标准输入); ',这是UB。 –

+0

没有'free()'.... –

+1

你为'poleNazvu [count] [ALOKACE_MALA-1]'分配了内存吗? – Bathsheba

回答

1

在呼叫

strcpy(poleNazvu[count][ALOKACE_MALA-1],levaStrana); //ITS HERE 

目的地poleNazvu[count][ALOKACE_MALA-1]未初始化指针。它的值是不确定导致未定义的行为

无论复印之前分配内存指针,或使用strdup代替(其确实在一个单一的呼叫分配和复制),或使poleNazvu不是指针数组的数组char


也有一些事情,并没有真正使任何意义,就像你为什么要使用poleNazvu[count][ALOKACE_MALA-1]作为目标?它将始终将字符串复制到数组数组中的相同条目。

也许你应该让poleNazvu的数组的数组char,而不是指向char指针数组的数组?像

char poleNazvu[ALOKACE_POLI][ALOKACE_MALA]; 

那么你就只是做

strcpy(poleNazvu[count], levaStrana); 

当然这需要levaStrana字符串的长度小于ALOKACE_MALA字符。因此,也许使用strncpy和明确的终止,而不是像

strncpy(poleNazvu[count], levaStrana, ALOKACE_MALA - 2); 
poleNazvu[count][ALOKACE_MALA - 1] = '\0'; 
+0

当我删除decladation中的指针时,它给了我“strcpy'的参数1传递使整数指针没有投射”与strcpy – Lance

+1

@ Lance请继续阅读我的(更新)答案。 –

+0

strdup是解决方案。我需要二维数组,因为我稍后将梯子排序,并且在变量之间切换多个值。现在我需要以某种方式释放变量poleNazvu吗? – Lance