从数组复制到变量导致***

Posted

技术标签:

【中文标题】从数组复制到变量导致***【英文标题】:copy from array to variable causes *** 【发布时间】: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_NUMj 显示正确的值。

在指定的线上,出现分段错误,我不知道为什么。我在这里想念什么?请注意,我已经尝试过strcpy,但没有成功,并希望获得有关为此目的使用其他功能的建议。

【问题讨论】:

首先,如果您使用 C++ 编程,为什么不使用new 而不是malloc?或者更好的是,std::vector 而不是自己处理内存? 当您为 GUESS 分配内存时,您使用的是未初始化的变量 DIGIT_COUNT 。对吗? 另一个提示,关于您的编码风格:所有大写字母名称通常用于预处理器宏或常量。 感谢您的提示,但这是我们公司的标准。 @sajas 你说得对,但我必须接受第一个回答者,非常感谢。 【参考方案1】:

这可能有问题:

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

ie:你在实际初始化之前使用了DIGIT_COUNT,所以它里面有一些垃圾数据。

还有:

http://qt-project.org/doc/qt-4.8/qstring.html#toInt 提供了一种实际检查转换是否成功的方法。使用它,它是为你好。

【讨论】:

别费心了,我会接受你的回答,我只是在等待时限结束。 @IsmetAlkan 您的代码也不会检查malloc 是否返回NULL。【参考方案2】:

我看不到您正在释放任何已使用的资源。

明智地使用 free()...

例子..

free(TEMP_NUM);

【讨论】:

虽然评论不错,但这实际上并没有回答 OP 的问题。

以上是关于从数组复制到变量导致***的主要内容,如果未能解决你的问题,请参考以下文章

SQL 编译错误:从 S3 复制到 Snowflake 时,JSON 文件格式只能生成一列类型变量或对象或数组

为啥要从方法修改变量? [复制]

js数组复制(不改变原数组)

无法将局部变量复制到结果数组

MarshalAs 是不是会导致数组副本?

如何将数组的内容复制到变量中