Я разрабатываю приложение QT Widgets с помощью 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_NUM
и j
показывают правильные значения.
На заостренной линии возникает ошибка сегментации, и я понятия не имею, почему. Что мне здесь не хватает? Обратите внимание, что я пробовал strcpy
без везения и открываю для предложений об использовании других функций для этой цели.
Это может быть проблематично:
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 предлагает способ проверить, успешно ли выполнено преобразование. Используйте его, он есть для вашего же блага.
Я не вижу, что вы освобождаете все используемые ресурсы.
Используйте бесплатный() разумно...
пример..
free(TEMP_NUM);
new
вместоmalloc
? Или, что еще лучше,std::vector
вместо того, чтобы обрабатывать память самостоятельно?