Конкатные массивы в C - PullRequest
       14

Конкатные массивы в C

0 голосов
/ 01 декабря 2018

Я немного тренируюсь в программировании C. Одна из задач - объединить два динамических массива.Элементы второго массива должны быть добавлены в конец первого массива.Дано следующее:

void concatArrays(int* numbers1, int length1, int* numbers2, int length2)
{
  //code
}

И это мой код для решения задачи:

#include <stdio.h>
#include <stdlib.h>

void concatArrays(int* numbers1, int length1, int* numbers2, int length2)
{
  numbers1 = (int*)realloc(numbers1, sizeof(int*) * (length1 + length2));
  for (int count = 0; count < length2; count++)
  {
    numbers1[length1 + count] = numbers2[count];
  }
}

int main()
{
  int* num = (int*)malloc(sizeof(int*) * 6);
  num[0] = 1;
  num[1] = 2;
  num[2] = 3;
  num[3] = 4;
  num[4] = 5;
  num[5] = 6;
  int* numbers = (int*)malloc(sizeof(int*) * 4);
  numbers[0] = 1;
  numbers[1] = 2;
  numbers[2] = 3;
  numbers[3] = 4;
  concatArrays(num, 6, numbers, 4);
  for (int count = 0; count < 10; count++)
  {
    printf("%d - ", num[count]);
  }
  return 0;
}

К сожалению, это не работает.Я знаю, что код работает, если я использовал указатель на указатель:

void concatArrays(int** numbers1, int length1, int** numbers2, int length2) { //code }

Тем не менее, это, кажется, недопустимо в отношении требований задачи.

Есть ли у вас какие-либо идеи?как я могу изменить свой код, отвечающий требованиям для решения задачи?

Заранее спасибо.

Редактировать:

Я забыл:

Вывод: 1 - 2 - 3 - 4 - 5 - 6 - 2054454589 - 32767 - -1280384664 - 32767 -

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018
void concatArrays(int* numbers1, int length1, int* numbers2, int length2)

Данный прототип передается по значению для вашего случая.

Следовательно, когда вы перераспределяете память.

  numbers1 = (int*)realloc(numbers1, sizeof(int*) * (length1 + length2));

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

Обратите внимание , что не гарантируется, что новый указатель, возвращаемый realloc, будет таким же, как старый.

code does work if I used a pointer to a pointer.

Это потому, что вы будете передавать по ссылке, любая модификация внутри функции обновит исходные переменные.


Таким образом, выделите больше памяти в самом main.

 int* num = (int*)malloc(sizeof(int) * 10);
0 голосов
/ 01 декабря 2018

В распределении памяти произошел сбой, соответствующий типу.

Обратите внимание, что значения массива являются целочисленными значениями, поэтому при выделении они занимают не память размера указателя, а скорее пространства int size:

поэтому распределение должно выглядеть следующим образом для массивов int:

void concatArrays(int** numbers1, int* length1, const int* numbers2, const int length2)
{
    *length1 = *length1 + length2;
    *numbers1 = (int*)realloc(*numbers1, sizeof(int) * (*length1));
    ...
}

Обратите внимание, что размер указателя int (int *) может отличаться от размера чистого типа int.

...