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

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

我用free错了吗?

此外,还有更有效memset的清算方式吗?

提前致谢。

4

3 回答 3

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);

在这里,您正在为 分配“N”个元素readBuffer并将它们初始化为0.
每当您想添加元素时,都可以使用push_back()方法。对于更大的块,您还可以探索resize()reserve()方法。

于 2012-05-02T11:56:55.167 回答
1

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

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

我用free错了吗?

不,您使用free()正确。

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

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

最后,检查是否malloc()已经返回是一个好主意NULL,如果没有足够的内存来满足请求,它可以这样做。

于 2012-05-02T11:55:45.807 回答
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,因为您想重新分配一个现有的内存块指针。this 的返回值指向新的内存块,如果堆上没有可用内存,则返回 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
于 2012-05-02T12:44:29.380 回答