我遇到了一个我希望在程序中重复使用的数组的问题。我需要动态更改大小并清除它。但不幸的是,调整大小不起作用。
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
清算替代方案吗?
提前致谢。
答案 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