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

时间:2018-04-22 05:33:46

标签: c++ arrays dynamic-arrays

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

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

Code Picture

Picture showing the difference between the two

你看到后者在第一个角色之后怎么没有做什么?这就是我想要的。

我该如何解决这个问题?

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

首先,de调试器默认假定char表示ascii字符而不是数字。它会显示char

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

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

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

答案 1 :(得分:2)

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

 #include <vector>

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

答案 2 :(得分:-1)

如果你想要一个动态增长的字符列表(数组),你需要的是一个指针列表,其中每个段的列表是一个很大的数字 - 比如1000.一个向量容器类牺牲了内存使用的能力成长。

vector container class allows for dynamic growth but uses a lot of memory

此外,对于大型数据列表,不建议一次动态增长一个数据元素。如果要为大型列表进行动态增长,请在块中创建一个列表,如下所示。使用大型列表段 - 比如说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,等于10亿。因此,集合只需要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.  
}