Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调整和清除数组大小_C++_C_Arrays - Fatal编程技术网

C++ 调整和清除数组大小

C++ 调整和清除数组大小,c++,c,arrays,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 me

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

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)

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

我使用的
free
都错了吗

不,您正确地使用了
free()

是否有比
memset
更有效的清算方法

我怀疑有没有更有效的方法。您可以尝试使用
calloc()
,这与
malloc()
类似,但zero会为您初始化内存

最后,最好检查
malloc()
是否返回了
NULL
,如果没有足够的内存来满足请求,可以这样做

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

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

我使用的
free
都错了吗

不,您正确地使用了
free()

是否有比
memset
更有效的清算方法

我怀疑有没有更有效的方法。您可以尝试使用
calloc()
,这与
malloc()
类似,但zero会为您初始化内存

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

对于任何数据类型,指针的大小(例如
readBuffer
)总是相同的(这里是4个字节)。您需要将malloc中给定的大小存储到一个临时文件中,然后使用
memset()

此外,
malloc()
的参数以字节为单位,因此
malloc(1)
理想情况下表示1字节。如果使用C++,则使用<代码>新< /> >:

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

在C++中,提供了这个便利性:

std::vector<uint8_n> readBuffer(N, 0);
std::vector readBuffer(N,0);
这里为
readBuffer
分配“N”个元素,并将它们初始化为
0

每当您想要添加元素时,都可以使用
push_-back()
方法。对于较大的数据块,您还可以探索
resize()
reserve()
方法。

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

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()
的参数以字节为单位,因此
malloc(1)
理想情况下表示1字节。如果使用C++,则使用<代码>新< /> >:

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

在C++中,提供了这个便利性:

std::vector<uint8_n> readBuffer(N, 0);
std::vector readBuffer(N,0);
这里为
readBuffer
分配“N”个元素,并将它们初始化为
0

每当您想要添加元素时,都可以使用
push_-back()
方法。对于较大的块,您还可以探索
resize()
reserve()
方法

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\u t)*4。这使您的手机尺寸合适

您应该使用realloc而不是malloc,因为您希望重新分配内存块的激励指针。此函数的返回值指向新内存块,如果堆上没有可用内存,则返回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
malloc的铸造是不必要的。 另外,readBuffer没有大小,您要做的是sizeof(Uint8\u t)*4。这使您的手机尺寸合适

您应该使用realloc而不是malloc,因为您希望重新分配内存块的激励指针。此函数的返回值指向新内存块,如果堆上没有可用内存,则返回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

你怎么知道是4点?还有,为什么不
realloc
?我用
sizeof(readBuffer)
sizeof(readBuffer)
检查,它不返回由
malloc
分配的内存大小,只返回存储指针值所需的字节数。@Naveen,除了查找长度,还有其他方法吗?这已经说了一遍又一遍,但我还是要重复一遍(因为这是标记为C++):使用std::vector,您的问题就解决了。如果您确实必须访问原始内存,请使用&(*vector.begin())您如何知道它是4?还有,为什么不
realloc
?我用
sizeof(readBuffer)
sizeof(readBuffer)
检查,它不返回由
malloc
分配的内存大小,只返回存储指针值所需的字节数。@Naveen,除了查找长度,还有其他方法吗?这已经说了一遍又一遍,但我还是要重复一遍(因为这是标记为C++):使用std::vector,您的问题就解决了。如果你真的必须使用原始内存,使用(和* vector .No.*)“如果你使用C++,然后使用新的”,我会说使用代码> STD::向量< /代码>。第一种方法有效,我现在就用它,下一个版本可能是STD::vector。“如果你使用C++,然后使用新的”,我会说使用<代码> STD::向量< /代码>。第一种方法是有效的,现在我将使用它,下一个版本可能是std::vector。