【发布时间】:2014-07-15 12:23:16
【问题描述】:
我正在用C++开发一个QT Widgets Application,具有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 之间的数字组成的字符串数组。这些数字不包含任何 0s 或多次相同的数字。我调试了代码,一切似乎都很好。我不能看NUM_ARRAY;它显示NUM_ARRAY "1234" char*,但我很肯定数组已正确填充,因为TEMP_NUM 和j 显示正确的值。
在指定的线上,出现分段错误,我不知道为什么。我在这里想念什么?请注意,我已经尝试过strcpy,但没有成功,并希望获得有关为此目的使用其他功能的建议。
【问题讨论】:
-
首先,如果您使用 C++ 编程,为什么不使用
new而不是malloc?或者更好的是,std::vector而不是自己处理内存? -
当您为 GUESS 分配内存时,您使用的是未初始化的变量 DIGIT_COUNT 。对吗?
-
另一个提示,关于您的编码风格:所有大写字母名称通常用于预处理器宏或常量。
-
感谢您的提示,但这是我们公司的标准。 @sajas 你说得对,但我必须接受第一个回答者,非常感谢。