【问题标题】:Why am I getting Invalid Write (Valgrind) with memcpy()?为什么我使用 memcpy() 得到无效写入 (Valgrind)?
【发布时间】:2019-09-14 06:57:57
【问题描述】:

我有三个Vector** 类型的数组:vectorsvectors_leftvectors_right。我正在尝试从vectors 分配值,以便将其拆分为这两个数组。 Valgrind 表示 Invalid Write 位于 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));
      }
  }

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

【问题讨论】:

  • 你没有为向量分配内存。
  • 您为vectors_leftvectors_right 分配了内存,但您没有为它们指向的数组vectors_left[u]vectors_right[u] 分配任何内存。

标签: c arrays pointers memcpy


【解决方案1】:

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

您也不应该使用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的声明,不知道&amp;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));
}

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2016-02-11
    • 2016-02-24
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多