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

Posted

技术标签:

【中文标题】指向较大 unsigned char 数组的每个第 n 个元素的指针数组【英文标题】:Array of pointers to every n-th element of bigger unsigned char array 【发布时间】:2015-04-21 19:01:43 【问题描述】:

我有一个巨大的无符号字符数组(称为 main_data),其中包含一些数据,这些数据会不时刷新。我想创建一个指向 main_data 的每个 n 元素的指针数组(称为 plot_data)。 我们的想法是从外部源将新数据上传到 main_data,并自动减少可用于我的绘图的 plot_data 这是我最接近的尝试(它是用托管 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]);
    

我已经尝试修复此问题几个小时,但似乎我没有得到任何东西,这应该相对简单。请帮助我理解我的错误。

【问题讨论】:

I would like to create an array (called plot_data) of pointers 你到底是在哪里做的? plot_datamain_data 的一个副本。如果你想进入main_data,你只需要plot_data = main_data + starting_index unsigned char* plot_data = new unsigned char[plotDataSize]; 这不是一个指针数组。 是的,这就是问题所在...... 【参考方案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);

现在泄漏已经消失了。

【讨论】:

就是这样,现在就像一个魅力 :) 感谢内存泄漏说明,我忘记了!【参考方案2】:

您正在创建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;

【讨论】:

非常感谢您的指正,我有点搞砸了,现在我想我明白了

以上是关于指向较大 unsigned char 数组的每个第 n 个元素的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

const数组如何只能在每个元素中包含字符,但char *数组能够指向每个元素中的字符串?

使用“unsigned char”指向原始数据缓冲区时需要了解内存管理

C: unsigned char * bytes 数组将元素复制到其他 unsigned char * 数组

ARDUINO 中将一个unsigned char 的数组的数据转化为一个long 型的数

C语言中的unsigned char数组怎么转成unsigned short数组

JAVA 与 C++ 数据类型转换 byte unsigned char