Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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_Arrays_Pointers - Fatal编程技术网

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 at
12.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,则为。您调用OC
tiles
和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()
a
NULL
指针是可以的,只会导致什么都没有发生。请参阅:这并不能回答问题(除非OP有一个非标准兼容的编译器,但谁会关心这些呢?),实际上应该只是一个注释,因为它只是问一个问题,而不是提供一个解决方案。
auto *tmp = (Tile*)realloc(*array, 2 * sizeof(Tile) );
*cap *= 2;
auto *tmp = (Tile*)realloc(*array, *cap * sizeof(Tile) );