2014-07-15 58 views
0

我正在開發一個QT窗口小部件的應用C++,用C的功能。我並不是說我在寫C++,所以請避免說「這不是C++」。這是我的代碼:拷貝計算器

#include <string.h> 
#include <stdio.h> 

---------------------------------------------------------- 

class MainWindow : public QMainWindow 
{ 

private: 

    char** NUM_ARRAY; 
    char* GUESS; 
    int  DIGIT_COUNT; 
    int  NUM_COUNT; 

    void fill_array(); 
    bool num_valid(char *NUM); 
}; 

---------------------------------------------------------- 

void MainWindow::fill_array() 
{ 
    int i, j = 0; 
    int START  = 1; 
    int END   = 9; 
    int CTR_START = 0; 
    int CTR_END  = 0; 

    NUM_COUNT = 1; 
    GUESS  = (char*)malloc(DIGIT_COUNT * sizeof(char)); 
    DIGIT_COUNT = ui->LE_DIGIT_COUNT->text().toInt(); 

    char* TEMP_NUM = (char*)malloc(DIGIT_COUNT * sizeof(char)); 

    for (i = 0; i < DIGIT_COUNT; i++) 
    { 
     NUM_COUNT *= END; 
     CTR_START = (CTR_START * 10) + (START++); 
     CTR_END = (CTR_END * 10) + (END--); 
    } 

    NUM_ARRAY = (char**)malloc(NUM_COUNT * sizeof(char*)); 

    for (i = CTR_START; i <= CTR_END; i++) 
    { 
     NUM_ARRAY[j] = (char*)malloc(DIGIT_COUNT * sizeof(char)); 

     sprintf(TEMP_NUM, "%d", i); 

     if (num_valid(TEMP_NUM)) 
      memcpy(NUM_ARRAY[j++], TEMP_NUM, DIGIT_COUNT * sizeof(char)); 
    } 

    memcpy(GUESS, NUM_ARRAY[0], DIGIT_COUNT * sizeof(char)); <----- ERROR 
    ui->L_GUESS->setText(GUESS); 
} 

我在做什麼;填充由1234到9876的數字組成的字符串數組。這些數字不包括多於一次的任何0或同一個數字。我調試代碼,一切都很好。我看不到NUM_ARRAY;它顯示NUM_ARRAY "1234" char*,但我肯定數組填寫正確,因爲TEMP_NUMj顯示正確的值。

在尖銳的線條上,發生了分段錯誤,我不知道爲什麼。我在這裏錯過了什麼?請注意,我試過strcpy沒有運氣,並打開有關使用其他功能的建議。

+0

首先,如果您使用C++編程,爲什麼不使用'new'而不是'malloc'?或者更好的是,['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)而不是處理你自己的內存? –

+0

感謝您的提示。 –

+1

當您爲GUESS分配內存時,您正在使用未初始化的變量DIGIT_COUNT。這是對的嗎? – sajas

回答

4

這可能是有問題的:

GUESS  = (char*)malloc(DIGIT_COUNT * sizeof(char)); 
DIGIT_COUNT = ui->LE_DIGIT_COUNT->text().toInt(); 

即:使用DIGIT_COUNT實際上初始化之前,所以它有一些垃圾數據。

另外:

http://qt-project.org/doc/qt-4.8/qstring.html#toInt提供了一種方法來實際檢查,如果轉換成功。使用它,它是爲了您自己的利益。

+0

感謝您的回答 –

+0

不用費心給予額外的努力,我會接受您的答案,我只是在等待時間限制結束。 –

+0

我喜歡查看其他人的代碼:P – fritzone

-2

我看不到您正在釋放所使用的資源。

使用免費()...明智

例子..

free(TEMP_NUM); 
+0

感謝您的提示。 –

+4

雖然一個很好的評論,這實際上並不*回答* OP的問題。 –

+0

是的,我已經標記了它。 –