2016-06-15 217 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