为什么我用memcpy()得到无效写(Valgrind)?

问题描述 投票:0回答:1

我有三个类型Vector**阵列:vectorsvectors_leftvectors_right。我正在尝试从vectors中分配值,以便将其拆分为这两个数组。 Valgrind说无效写在memcpy()线。

我尝试了不同的组合删除&并将*添加到sizeof()参数中。

  int count_left = count / 2;
  int count_right = is_even(count) ? (count / 2) : (count / 2) + 1;
  Vector** vectors_left = malloc(sizeof(Vector*) * count_left);
  Vector** vectors_right = malloc(sizeof(Vector*) * count_right);

  for (int u = 0; u < count; u++)
  {
      if (u < count_right - 1) {
          memcpy(&vectors_left[u], &vectors[u], sizeof(Vector));
      } else {
          memcpy(&vectors_right[u - count_right + 1], &vectors[u], sizeof(Vector));
      }
  }

我的代码运行正常,但我遇到了这种泄漏。

c arrays pointers memcpy
1个回答
0
投票

您需要为要复制的向量分配内存。

你也不应该拿vectors_left[u]的地址。 vectors_left是一个指针数组,所以vectors_left[u]是一个指针。

  for (int u = 0; u < count; u++)
  {
      if (u < count_right - 1) {
          vectors_left[u] = malloc(sizeof(Vector));
          memcpy(vectors_left[u], &vectors[u], sizeof(Vector));
      } else {
          vectors_right[u - count_right + 1] = malloc(sizeof(Vector));
          memcpy(vectors_right[u - count_right + 1], &vectors[u], sizeof(Vector));
      }
  }

没有看到vectors的声明,我不知道&vectors[u]是对还是错。

我也不会这样做作为带有if语句的循环,我将它作为两个循环,因为两个案例之间没有重叠。

for (int u = 0; u < count_right - 1; u++) {
    vectors_left[u] = malloc(sizeof(Vector));
    memcpy(vectors_left[u], &vectors[u], sizeof(Vector));
}
for (int u = count_right - 1; u < count; u++) {
    vectors_right[u - count_right + 1] = malloc(sizeof(Vector));
    memcpy(vectors_right[u - count_right + 1], &vectors[u], sizeof(Vector));
}
© www.soinside.com 2019 - 2024. All rights reserved.