指向更大的unsigned char数组的每个第n个元素的指针数组

时间:2015-04-21 19:01:44

标签: c++ arrays pointers visual-c++

我有一大堆无符号字符(称为 main_data ),其中包含一些数据,这些数据偶尔会刷新一次。我想创建一个指向 main_data 的每个 n 元素的指针的数组(称为 plot_data )。 我们的想法是从外部来源将新数据上传到 main_data ,并为我的情节自动提供缩小的 plot_data 这是我最接近的尝试(它是用Managed C ++,VC ++ 2010,WinForms项目编写的:

    int mainDataSize = 64;
    int plotDataSize = 8;

    unsigned char* main_data = new unsigned char[mainDataSize];
    for (int i = 0; i < mainDataSize; i++) {
        main_data[i] = 2 * (i % 32);
    }

    unsigned char* plot_data = new unsigned char[plotDataSize];
    for (int i = 0; i < plotDataSize; i++) {
        int idx = (int)(mainDataSize / plotDataSize * i);
        plot_data[i] = main_data[idx];
    }

    printf("Original data:\n");
    for (int i = 0; i < mainDataSize; i++) {
        printf("%d ", main_data[i]);
    }
    printf("\n\nData for plot:\n");
    for (int i = 0; i < plotDataSize; i++) {
        printf("%d ", plot_data[i]);
    }

然后,在修改 main_data 之后,我希望打印指针数组会给我修改后的值。以下是修改和打印的代码:

    for (int i = 0; i < mainDataSize; i++) {
        main_data[i] = i;
    }

    printf("\n\nChange made - Main data:\n");
    for (int i = 0; i < mainDataSize; i++) {
        printf("%d ", main_data[i]);
    }

    printf("\n\nChange made - Plot data:\n");
    for (int i = 0; i < plotDataSize; i++) {
        printf("%d ", plot_data[i]);
    }

我一直试图解决这个问题几个小时,似乎我没有得到一些东西,这应该是相对简单的。请帮我理解我的错误。

2 个答案:

答案 0 :(得分:1)

您正在创建一个chars数组,而不是char *'s数组。您需要更改代码以使用指针数组:

int main()
{
    int mainDataSize = 64;
    int plotDataSize = 8;

    unsigned char ** main_data = new unsigned char * [mainDataSize];
    for (int i = 0; i < mainDataSize; i++) {
        main_data[i] = new unsigned char(2 * (i % 32));
    }

    unsigned char ** plot_data = new unsigned char * [plotDataSize];
    for (int i = 0; i < plotDataSize; i++) {
        int idx = (int)(mainDataSize / plotDataSize * i);
        plot_data[i] = main_data[idx];
    }

    printf("Original data:\n");
    for (int i = 0; i < mainDataSize; i++) {
        printf("%d ", *main_data[i]);
    }

    printf("\n\nData for plot:\n");
    for (int i = 0; i < plotDataSize; i++) {
        printf("%d ", *plot_data[i]);
    }

    for (int i = 0; i < mainDataSize; i++) {
        *main_data[i] = i;
    }

    printf("\n\nChange made - Main data:\n");
    for (int i = 0; i < mainDataSize; i++) {
        printf("%d ", *main_data[i]);
    }

    printf("\n\nChange made - Plot data:\n");
    for (int i = 0; i < plotDataSize; i++) {
        printf("%d ", *plot_data[i]);
    }

    for (int i = 0; i < mainDataSize; i++) {
        delete main_data[i];
    }

    delete[] main_data;
    delete[] plot_data;

    return 0;
}

答案 1 :(得分:1)

  

我想创建一个指针

的数组(称为plot_data)

您发布的代码不会创建指针数组。它创建了一个unsigned char的动态数组。

如果要创建指针数组:

unsigned char** plot_data = new unsigned char*[plotDataSize];

然后在循环中:

plot_data[i] = main_data + idx;

  

请注意,这是错误的代码,因为到处都有内存泄漏

我还建议您使用std::vector,因为如果没有正确调用delete[],您的代码将泄漏内存。

#include <vector>
//...
std::vector<unsigned char> main_data(mainDataSize);
//...
std::vector<unsigned char*> plot_data(plotDataSize);

泄漏现在已经消失。