2009-11-08 26 views
8

Jak połączyć dwie tablice, aby uzyskać pojedynczą tablicę zawierającą elementy obu oryginalnych tablic?Jak mogę połączyć dwie tablice w C?

+1

Tak ... Ponieważ wydaje się, że obie odpowiedzi odpowiadają na interpretację "konkatenacji", a PO nie powrócił w celu wyjaśnienia, zredagowałem pytanie, aby to odzwierciedlić. – Shog9

Odpowiedz

26

Tablice w języku C są po prostu ciągłym obszarem pamięci ze wskaźnikiem do ich początku *. Więc ich łączenie obejmuje:

  1. Znajdź długość Macierze A i B (prawdopodobnie będzie trzeba znać liczbę elementów i sizeof każdy element)
  2. przydzielania (malloc) nową tablicę C, które ma rozmiar A + B.
  3. Skopiuj (memcpy) pamięć od A do C,
  4. Skopiuj pamięć z B na C + na długość A (patrz 1).
  5. Możecie też chcą de-przeznaczyć (free) pamięć A i B.

pamiętać, że jest kosztowna operacja, ale to jest teoria podstawowe. Jeśli korzystasz z biblioteki zapewniającej pewną abstrakcję, możesz być lepiej. Jeśli A i B są bardziej skomplikowane niż prosta tablica (np. Posortowane tablice), będziesz musiał wykonać inteligentniejsze kopiowanie, a następnie kroki 3 i 4 (patrz: how do i merge two arrays having different values into one array).


  • Chociaż dla celów tego pytania, wyjaśnienie wskaźnik wystarczą, ściśle rzecz biorąc (i dla uspokojenia poniższego commenter): C ma koncepcję tablicy, które mogą być używane bez składnia wskaźników. Wdrożenie mądre, jednak tablica C i ciągły obszar pamięci, ze wskaźnikiem są na tyle bliskie, że mogą być i często są używane zamiennie.
+0

Skąd się wzięło "... ze wskaźnikiem na ich początek ..."? Kiedy deklaruję 'int a [10]' otrzymuję ciągły obszar pamięci z 10 'int' w nim i bez żadnych wskaźników. – AnT

+2

@AndreyT: 'a' jest twoją wskazówką. Wydaje się, że jesteś tego świadomy w swoim komentarzu do drugiej odpowiedzi ... – Shog9

+0

@ Shog9: 'a' nie jest wskaźnikiem. 'a' jest tablicą. Gdy typ tablicy rozpada się na typ wskaźnika, wynikowy wskaźnik jest po prostu pośrednią wartością tymczasową, która nie ma nic wspólnego z 'a'. Wątek nad powyższymi stanami jest niepoprawny, chyba że mówi konkretnie o tablicach "malloc". – AnT