我有一个C ++程序,它有一个存储一些值的BYTE数组。我需要找到该数组的长度,即该数组中的字节数。请帮助我。
这是代码:
BYTE *res;
res = (BYTE *)realloc(res, (byte_len(res)+2));
byte_len
是一个虚构的函数,它返回BYTE数组的长度,我想知道如何实现它。
答案 0 :(得分:8)
鉴于你的代码:
BYTE *res;
res = (BYTE *)realloc(res, (byte_len(res)+2));
res
是指向BYTE
类型的指针。它指向n
BYTES的连续序列的事实是由于你这样做的事实。有关长度的信息不是指针的一部分。换句话说,res
只指向一个BYTE
,如果您将其指向您可以访问的正确位置,则可以使用它来获取BYTE
值之前或之后它
BYTE data[10];
BYTE *res = data[2];
/* Now you can access res[-2] to res[7] */
所以,回答你的问题:你肯定知道在拨打BYTE
或malloc()
时分配了多少realloc()
,所以你应该跟踪这个数字。
最后,使用realloc()
是错误的,因为如果realloc()
失败,则会泄漏内存。使用realloc()
的标准方法是使用临时的:
BYTE *tmp;
tmp = (BYTE *)realloc(res, n*2);
if (tmp == NULL) {
/* realloc failed, res is still valid */
} else {
/* You can't use res now, but tmp is valid. Reassign */
res = tmp;
}
答案 1 :(得分:3)
BYTE Data[200];
您可以使用常用的宏找到长度(以元素为单位):
#define ARRAY_LENGTH(array) (sizeof(array)/sizeof((array)[0]))
但是,在C ++中,我更喜欢在可能的情况下使用以下内容:
template<typename T, size_t N>
inline size_t array_length(T data[N])
{
return N;
};
因为它可以防止这种情况发生:
// array is now dynamically allocated
BYTE* data = new BYTE[200];
// oops! this is now 4 (or 8 on 64bit)!
size_t length = ARRAY_LENGTH(data);
// this on the other hand becomes a compile error
length = array_length(data);
在C ++中,原始指针(如byte*
)不受限制。如果您需要 始终 在使用数组时所做的长度,则必须分别跟踪长度。像std::vector
这样的类有助于此,因为它们存储数组的长度和数据。
答案 2 :(得分:3)
在C方式(也与C ++相关)中,您通常需要记录数组的长度:
BYTE *res;
int len = 100
res = (BYTE *)realloc(res, (byte_len(len)));
len += 2;
res = (BYTE *)realloc(res, (byte_len(len)));
使用std::vector容器类的C ++方式的替代方法;向量具有自行管理数组长度的能力,还可以处理内存管理问题。
编辑:正如其他人指出的那样,realloc的使用是不正确的,因为它会导致内存泄漏,这只是处理跟踪长度。您应该接受其他回复之一作为最佳答案答案 3 :(得分:2)
鉴于你似乎有可用的信息,没有办法做你想要的。当您使用堆上分配的数组时,如果需要再次使用它,则需要在某处保存大小。 new
和malloc
都不会为您执行此操作。
现在,如果您在某处保存了数组中的项目数,则可以执行此操作以获取字符的总大小,即realloc
使用的单位。代码如下所示:
size_t array_memsize = elems_in_array * sizeof(BYTE);
如果您真的使用的是C ++而不是C,我强烈建议您使用矢量模板,而不是转到malloc
和realloc
。矢量模板速度快,不会像滚动自己的内存管理那样容易出错。此外,它会为您跟踪大小。
答案 4 :(得分:2)
最初分配指针时,还需要跟踪长度:
size_t bufSize = 100;
BYTE* buf = malloc(sizeof(BYTE ) * bufSize);
当你重新分配时,你应该小心重新分配:
BYTE* temp = realloc(buf,sizeof(BYTE ) * (bufSize+2));
if (temp != NULL)
{
bufSize += 2;
buf = temp;
}
答案 5 :(得分:1)
如果它是在堆栈上分配的局部变量,您可以这样计算:
BYTE array[] = { 10, 20, 30, ... };
size_t lenght = sizeof(array) / sizeof(BYTE);
如果你收到一个指向数组开头的指针,或者你动态地(在堆上)分配它,你需要保持长度和指针。
编辑:我还建议你使用STL向量来满足这些需求,因为它已经实现了动态数组语义。