Почему я получаю Invalid Write (Valgrind) с помощью memcpy ()? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть три массива типа Vector**: vectors, vectors_left и vectors_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));
      }
  }

Мой код работает нормально, но у меня такие утечки.

1 Ответ

0 голосов
/ 25 апреля 2019

Вам нужно выделить память для векторов, в которые вы копируете.

Вы также не должны брать адрес 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));
}
...