我试图在C ++中创建一个动态分配的unsigned char*
类型的数组。但是,当我这个时,我得到一个字符串而不是括号({}
)数组,这就是我想要的。
unsigned char* arr = new unsigned char[arrLen];
Picture showing the difference between the two
你看到后者在第一个角色之后怎么没有做什么?这就是我想要的。
我该如何解决这个问题?
感谢您的时间。
答案 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.
}