繁体   English   中英

创建动态分配的数组C ++

[英]Create Dynamically Allocated Array C++

我正在尝试在C ++中创建类型为unsigned char*的动态分配数组。 但是,当我这样做时,我得到的是一个字符串,而不是我想要的括号括起来的( {} )数组。

unsigned char* arr = new unsigned char[arrLen];

代码图片

图片显示了两者之间的区别

您会看到后者如何不仅在第一个字符之后消失了? 这就是我想要的。

我该如何解决?

感谢您的时间。

首先,默认情况下,de debugger假定char代表一个ascii字符而不是一个数字。 它将像这样显示char

arr2具有类型const char[3]因此调试器知道要显示3个元素。

arr类型为const char* 调试器无法知道它是仅一个元素还是具有一定数量元素的数组。

例如,如果您使用Visual Studio,则可以通过在监视菜单中添加语法为arr,3的“变量监视”来提示调试器显示三个字符。

我不确定这是否是您要寻找的,但是您是否尝试过使用std :: vector? 它至少可以处理您正在寻找的动态分配,并且不应将NULL字符视为字符串的结尾。

 #include <vector>

 std::vector<char> arr = { 0x5A, 0x00, 0x2B };

如果想要一个可动态增长的chars(array)列表,则需要的是一个指针列表,其中每个段的列表都是很大的数字(例如1000)。向量容器类会牺牲内存使用量来实现增长。

向量容器类允许动态增长,但使用大量内存

同样,对于大量数据,也不建议一次动态增长一个数据元素。 如果要动态增长大列表,请分块创建一个列表,如下所示。 使用较大的列表细分-例如1000个单位。 在以下示例中,我创建了1000个列表。 我通过创建一个包含1000个指针的数组来做到这一点。 这将创建您要查找的100万个字符,并且可以动态增长。 以下示例显示了如何执行此操作。

.

void main() {
    unsigned char* listsegment[1000];
int chrn=0;

    int x, y = 0;
    for (int x = 0; x < 1000; x++) {
        listsegment[x] = new unsigned char[1000];
        for (y = 0; y < 1000; y++) {
            *(listsegment[x] + y) = chrn;
if (chrn >=255) chrn=0;
else chrn++;
        }
    }

}

完成程序-如果需要动态分配1000个以上的段怎么办?

然后创建一个细分市场列表。 它可以在链接列表中,也可以在容器类中。

由于单个集合创建1000个包含1000个字符的段,因此这些集合的集合可能不必大于1000。数千个集合将等于(1000 * 1000)* 1000,即等于十亿个。 因此,集合只需要为1000个或更少,就可以快速迭代通过,这使得不需要对集合进行随机访问。

这是程序重做以通过无限大的集合集合来支持无限数量的集合。 通常,这也是分段动态内存分配的一个很好的例子。

#include <iostream>
#include<queue>

using namespace std;

struct listSegmentSetType {
    unsigned char* listSegment[1000];
    int count=0;
};


void main() {

    listSegmentSetType listSegmentSet;
    queue<listSegmentSetType> listSegmentSetCollection;
    int numberOfListSegmentSets = 0;

    int chrn = 0;

    int x, y = 0;
    listSegmentSet.count = 0;
    for (int x = 0; x < 1000; x++) {

        listSegmentSet.listSegment[x] = new unsigned char[1000];
        for (y = 0; y < 1000; y++) {
            *(listSegmentSet.listSegment[x] + y) = chrn;
            if (chrn >= 255) chrn = 0;
            else chrn++;
        }
        listSegmentSet.count++;
    }

    // add just completely filled out first list segment set to que
    listSegmentSetCollection.push(listSegmentSet);
    numberOfListSegmentSets++;

    // now fill in second set of list segments-

    listSegmentSet.count = 0;

    for (int x = 0; x < 1000; x++) {

            listSegmentSet.listSegment[x] = new unsigned char[1000];
        for (y = 0; y < 1000; y++) {
            *(listSegmentSet.listSegment[x] + y) = chrn;
            if (chrn >= 255) chrn = 0;
            else chrn++;
        }
        listSegmentSet.count++;
    }
    listSegmentSetCollection.push(listSegmentSet);
    numberOfListSegmentSets++;

    // now fill out any more sets of list segments and add to collection 
    // only when count listSegmentSet.count is no
    // longer less than 1000.  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM