调整大小和清除数组

时间:2012-05-02 11:49:48

标签: c++ c arrays

我遇到了一个我希望在程序中重复使用的数组的问题。我需要动态更改大小并清除它。但不幸的是,调整大小不起作用。

uint8_t * readBuffer; // Create array pointer

readBuffer = (uint8_t *) malloc(4); // Mem. alloc. 4bytes
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
....
readBuffer = (uint8_t *) malloc(1) // Mem. alloc. 1byte
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block

在调整大小步骤中,我的数组的长度仍然是前者(4)。

我使用free都错了吗?

还有更多有效的memset清算替代方案吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

对于任何数据类型,指针的大小(例如readBuffer)总是相同的(此处为4个字节)。您需要将malloc中给出的大小存储为临时值,然后使用memset()

uint size = 4;
readBuffer = (uint8_t *) malloc(size); // Mem. alloc. 4bytes
memset(readBuffer, 0, size); // Reset array

此外malloc()的参数以字节为单位,因此malloc(1)表示理想情况下为1个字节。如果您使用的是C ++,请使用new

readBuffer = new uint8_t[N];  // 'N' is number of elements of "uint8_t"

修改

在C ++中,std::vector可以轻松提供此功能:

std::vector<uint8_n> readBuffer(N, 0);

您要为readBuffer分配'N'个元素,并将其初始化为0
无论何时想要添加元素,都可以使用push_back()方法。对于更大的块,您还可以浏览resize()reserve()方法。

答案 1 :(得分:1)

  

在调整大小步骤中,我的数组的长度仍然是前者(4)。

问题是sizeof(readBuffer)返回指针的大小,而不是malloc()分配的内存量。如果你想跟踪后者,你必须自己动手。

  

我使用free都错了吗?

不,您正确使用free()

  

是否有更有效的memset替代清算方法?

我怀疑是否有更多 更有效的方法。您可以尝试使用calloc(),就像malloc()一样,但为您初始化内存。

最后,检查malloc()是否已返回NULL是一个好主意,如果内存不足以满足请求,它可以执行此操作。

答案 2 :(得分:1)

uint8_t * readBuffer; // Create array pointer

readBuffer = (uint8_t *) malloc(4); // Mem. alloc. 4bytes
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
....
readBuffer = (uint8_t *) malloc(1) // Mem. alloc. 1byte
memset(readBuffer, 0, sizeof(readBuffer); // Reset array
// Do stuff
free(readBuffer) // Release mem. block

没有必要铸造malloc。 此外,readBuffer没有大小,你想要做的是sizeof(Uint8_t)* 4.这给你正确的大小。

而不是malloc,你应该使用realloc,因为你想重新分配一个内存块的激活指针。如果堆上没有可用内存,则返回值指向新内存块,或NULL。新代码:

uint8_t * readBuffer; // Create array pointer

readBuffer = malloc(4); // Mem. alloc. 4bytes
memset(readBuffer, 0, (sizeof(uint8_t) * 4)); // Reset array
// Do stuff
free(readBuffer) // Release mem. block
....
uint8_t * temp = realloc(readBuffer, 1); // Mem. alloc. 1byte
if(temp != NULL) readBuffer = temp; //Check if their was enough room to allocate memory
memset(readBuffer, 0, (sizeof(uint8_t) * 4)); // Reset array
// Do stuff
free(readBuffer) // Release mem. block