C에서 Char 배열 복사

Jinku Hu 2023년10월12일
  1. memcpy함수를 사용하여 C에서 Char 배열 복사
  2. memmove함수를 사용하여 C에서 Char 배열 복사
C에서 Char 배열 복사

이 기사는 C에서 char 배열을 복사하는 방법에 대한 여러 방법을 보여줍니다.

memcpy함수를 사용하여 C에서 Char 배열 복사

char 배열은 아마도 C 코드에서 조작되는 가장 일반적인 데이터 구조이며 배열 내용을 복사하는 것은 핵심 작업 중 하나입니다. C 스타일 문자열은char 배열과 매우 유사합니다. 따라서 배열 내용 복사를 처리하는 여러 가지 방법이 있습니다. 다음 예제에서 우리는 두 개의 배열,arrarr2를 선언했습니다. 전자는 문자 목록 표기법으로 초기화되고 후자는 문자열 리터럴로 초기화됩니다. 이것은 다른 배열 구조와 크기를 산출합니다. arr 객체는 메모리에 7 자이지만arr2는 17 자에 널 바이트를 더한 결과 18 바이트 객체가됩니다. 결과적으로 배열의 길이를 나타내는 두 번째 인수로sizeof arr2-1 표현식의 값을 전달합니다. 반면에printf 함수와% s 형식 지정자를 사용하여arr2 배열의 내용을 인쇄 할 수 있습니다.

char배열을 다른 위치에 복사 할 때 동일한 세부 사항을 고려해야합니다. memcpy함수는<string.h>헤더 파일에 정의 된 표준 라이브러리 문자열 유틸리티의 일부입니다. 세 개의 매개 변수가 필요하며 그 중 첫 번째는 배열의 내용이 복사되는 대상 포인터입니다. 두 번째 매개 변수는 소스 배열에 대한 포인터이고 마지막 매개 변수는 복사 할 바이트 수를 지정합니다. sizeof연산자는char배열 객체 크기를 바이트 단위로 반환합니다. 따라서sizeof arr표현식 값을 전달하는malloc호출로 동적 메모리를 할당합니다. 반환 된 메모리 영역은arr내용을 보관하기에 충분하며 버퍼 오버플로 버그에 대해 걱정할 필요가 없습니다. 하지만malloc에서 반환 된 포인터는 해제되어야합니다.

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

void printCharArray(char *arr, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  printf("%lu\n", sizeof arr);
  printf("%lu\n", sizeof arr2);

  printCharArray(arr, sizeof arr);
  printCharArray(arr2, sizeof arr2 - 1);

  char *str = malloc(sizeof arr);
  memcpy(str, arr, sizeof arr);
  printf("str: ");
  printCharArray(str, sizeof arr);
  free(str);

  str = malloc(sizeof arr2);
  memcpy(str, arr2, sizeof arr2);
  printf("str: %s\n", str);
  free(str);

  exit(EXIT_SUCCESS);
}

출력:

7
18
a, b, c, d, e, f, g,
a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
str: a, b, c, d, e, f, g,
str: array initialized

memmove함수를 사용하여 C에서 Char 배열 복사

memmove는 표준 라이브러리 문자열 유틸리티의 또 다른 메모리 영역 복사 기능입니다. 대상 및 소스 메모리 영역이 겹치는 경우를 수용하기 위해보다 강력한 기능으로 구현되었습니다. memmove 매개 변수는memcpy와 동일합니다.

arr2내용을 복사 할 때 세 번째 매개 변수로sizeof arr2표현식을 전달했습니다. 종료하는 널 바이트조차도 대상 포인터에 복사되었지만 결과적으로printCharArray를 사용하는 대신% s와 함께printf를 호출하여 내용을 출력함으로써이 작업을 활용합니다.

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

void printCharArray(char *arr, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  char *str = malloc(sizeof arr);
  memmove(str, arr, sizeof arr);
  printf("str: ");
  printCharArray(str, sizeof arr);
  free(str);

  str = malloc(sizeof arr2);
  memmove(str, arr2, sizeof arr2);
  printf("str: %s\n", str);
  free(str);

  exit(EXIT_SUCCESS);
}

출력:

str: a, b, c, d, e, f, g,
str: array initialized
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Array