C 瓦尔格兰德';这是无效的写入
班级:C 瓦尔格兰德';这是无效的写入,c,arrays,pointers,C,Arrays,Pointers,班级: class Tile { public: long long size, joint; }; 我的主要目标是: int main() { // double minW, minL; unsigned tileCap = 10, tileCount = 0; bool wasTransformed = false; auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) ); GetInput(&minW,
class Tile {
public:
long long size, joint;
};
我的主要目标是:
int main() {
//
double minW, minL;
unsigned tileCap = 10, tileCount = 0;
bool wasTransformed = false;
auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );
GetInput(&minW, &minL, &tiles, &tileCount, &wasTransformed);
//etc.
}
这里有问题的函数是GetInput()
:
和我的DoubleArray()
:
运行程序似乎很好,没有显示错误,结果似乎是正确的。例如:
360 217
0.1 0.0
0.2 0.0
0.3 0.0
0.4 0.0
0.6 0.0
0.8 0.0
1.2 0.0
2.4 0.0
4.1 0.0
8.2 0.0
12.3 0.0
16.4 0.0
24.6 0.0
32.8 0.0
49.2 0.0
Valgrind at12.3 0
打印大小为8的无效写入。所以在我看来,我重新分配的内存不正确。但如果是,为什么打印出来的值会正常加载?换句话说,所有输入都正确加载到数组中
那么我做错了什么?使用memset
?不是免费的
ing正确吗
void DoubleArray(Tile **array, unsigned *cap) {
//
auto *tmp = (Tile*)realloc(*array, *cap);
if(tmp) {
*array = tmp;
*cap *= 2;
(*cap)--;
} else {
printf("Error allocating memory.\n");
free(tmp);
}
}
tmp
尚未重新分配(由于错误),那么为什么free()
it 您正在错误地重新分配内存。关于要分配的大小,std::malloc
、std::calloc
和std::realloc
的接口有些不一致和混乱std::malloc
和std::realloc
采用单个size参数,该参数应为对象数量乘以其大小std::calloc
接受两个参数,一个表示对象的数量,一个表示一个对象的大小
你在打电话吗
auto *tmp = (Tile*)realloc(*array, 2 * sizeof(Tile) );
这(重新)为两个磁贴分配空间。你应该写一些类似的东西
*cap *= 2;
auto *tmp = (Tile*)realloc(*array, *cap * sizeof(Tile) );
额外的内存将不初始化,因此可能需要MSETSER()它0。< /P>你的问题是标记C++,但是你要集约使用C库函数。code>calloc和
free
不应在正常使用情况下使用(除非您正在编写专用分配器或operator new
函数)。无论如何,在重用指针之前,您永远不会释放分配的内存,而在DoubleArray
中,您似乎在将阵列容量加倍之前分配原始大小。长话短说,使用std::vector
,或者通过一个更简单的示例学习如何使用低级C分配函数。@SergeBallesta为什么在重用数组时需要释放它?我在停止重用它之后释放它,直到那时我才使用memset
设置它。这不对吗?我使用C库函数是因为vector
是不允许的。标记已被修复。如果是C,则为。您调用OCtiles
和main,然后在GetInput
中再次调用它:原始块泄漏。无论如何,class
、bool
和auto
不是C。惯用的C应该是typedef struct\u Tile{long long long size,joint;}Tile代码>(*tiles)[*tileCount]
错误:如果您分配了tileCount
tiles,则您的位置超过了数组的末尾(索引从C中的0开始)。而DoubleArray
仅分配2个分片,这可能不是预期的结果。如果您需要帮助,请将所有的修剪到A或小心地控制所有分配的大小,请选择一种语言,C语言或C++语言。@ SergBalLista C具有BooL支持,类< /C>基本上是“代码>结构> <代码>,具有不同的默认封装。code>tileCount
不应该超过数组的末尾,因为我有一个条件,如果需要的话,可以将数组加倍(我的假设)。我使用class而不是struct的原因是它比较短。不管怎样,使用的编译器是g++的。自动是我的IDE所改变的。无论如何,realloc
正如其他人指出的那样是不正确的。那free()
毫无意义,但并不危险。该标准规定,尝试free()
aNULL
指针是可以的,只会导致什么都没有发生。请参阅:这并不能回答问题(除非OP有一个非标准兼容的编译器,但谁会关心这些呢?),实际上应该只是一个注释,因为它只是问一个问题,而不是提供一个解决方案。
auto *tmp = (Tile*)realloc(*array, 2 * sizeof(Tile) );
*cap *= 2;
auto *tmp = (Tile*)realloc(*array, *cap * sizeof(Tile) );