C ++中BYTE数组的长度

时间:2010-02-02 08:51:51

标签: c++

我有一个C ++程序,它有一个存储一些值的BYTE数组。我需要找到该数组的长度,即该数组中的字节数。请帮助我。

这是代码:

BYTE *res;
res = (BYTE *)realloc(res, (byte_len(res)+2));

byte_len是一个虚构的函数,它返回BYTE数组的长度,我想知道如何实现它。

6 个答案:

答案 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] */

所以,回答你的问题:你肯定知道在拨打BYTEmalloc()时分配了多少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)

鉴于你似乎有可用的信息,没有办法做你想要的。当您使用堆上分配的数组时,如果需要再次使用它,则需要在某处保存大小。 newmalloc都不会为您执行此操作。

现在,如果您在某处保存了数组中的项目数,则可以执行此操作以获取字符的总大小,即realloc使用的单位。代码如下所示:

size_t array_memsize = elems_in_array * sizeof(BYTE);

如果您真的使用的是C ++而不是C,我强烈建议您使用矢量模板,而不是转到mallocrealloc。矢量模板速度快,不会像滚动自己的内存管理那样容易出错。此外,它会为您跟踪大小。

答案 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向量来满足这些需求,因为它已经实现了动态数组语义。