CHANGEL
SOLID BASICS
CHANGEL

공지사항

  • DEV.CHANGEL PROFILE
  • SOLID BASIC (289)
    • 공부 STUDY (115)
      • JAVA (57)
      • C | C++ (34)
      • CS (11)
      • MySQL (2)
      • ALGORITHM (1)
      • HTML (2)
      • CSS (2)
      • JS (2)
      • CODING (0)
      • MINI PROJECT (3)
    • 스프링 SPRING (21)
      • [SPRING] 김영한 스프링 입문 (11)
      • [SPRING] 남궁성 스프링의 정석 (1)
      • [SPRING] 스프링 핵심원리 (9)
    • 전공 수업 CS (65)
      • Computer Network (13)
      • algorithms (21)
      • Computer Architecture (7)
      • Software Engineering (4)
      • Data Structure (2)
      • DataBase (1)
      • Digital Engineering (14)
      • Discrete Mathematics (3)
      • Introduction to programming (0)
      • Mobile Software (0)
      • Intelligence and Informatio.. (0)
    • 대외활동 (35)
      • 신한은행 대학생 홍보대사 34기 (8)
      • SKT T프렌즈 5기 (13)
      • SK DEVOTION YOUNG 1기 (9)
      • 성균관 대학교 공학교육혁신센터 수강 (3)
      • 수상 기록 (1)
    • 솝트 33기 안드로이드 (7)
      • [솝트 33기] 회고록 (0)
      • [솝트 33기] 안드로이드 왕초보 스터디 (2)
      • [솝트 33기] 코틀린 스터디 (0)
      • [솝트 33기] Git을 털어보자 깃털 스터디 (4)
    • 멋쟁이사자처럼 11기 (6)
      • 멋사 회고록 (4)
      • 백엔드 세션 (1)
      • 기획 세션 (1)
      • 연합해커톤 운영단 (기획팀) (0)
    • 백준 BAEKJOON (16)
    • 독서 BOOK (10)
    • 자격증 CERTIFICATE (1)
    • 준비 서류 및 회고록 MEMOIR (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

최근 댓글

인기 글

CHANGEL
공부 STUDY/C | C++

[C] 동적 메모리 | memset() 함수

공부 STUDY/C | C++

[C] 동적 메모리 | memset() 함수

2022. 11. 29. 02:50

전공 수업을 공부하던 중 안교수님이 따로 가르쳐두신 memset() 함수에 대해 정리해보고자 한다!

메모리를 초기화 해줄 수 있는 memset() 함수

 

1. C언어, C++에서의 memset 함수


memset 함수는 메모리의 내용(값)을 원하는 크기만큼 특정 값으로 세팅할 수 있는 함수 이다.

그냥 직관적으로
"memory + setting 메모리를 (특정 값으로) 세팅한다." 이렇게 생각하면 편할 것 같다.

함수 원형
void* memset(void* ptr, int value, size_t num);

첫번째 인자 void* ptr은 세팅하고자 하는 메모리의 시작 주소
즉, 그 주소를 가리키고 있는 포인터가 위치하는 자리이다.

 

두번째 인자 value는 메모리에 세팅하고자 하는 값이다.
int 타입으로 받지만 내부에서는 unsigned char 로 변환되어서 저장된다.

즉 'a' 이런것을 넣어도 무방하다는 뜻임!

 

세번째 인자 size_t num은 길이를 뜻한다.

이 길이는 바이트 단위로써 메모리의 크기 한조각 단위의 길이를 말한다.

보통 "길이 * sizeof(데이터타입)" 의 형태로 작성하면 된다.

반환값은 성공하면 첫번째 인자로 들어간 pt(포인터)를 반환하고, 실패한다면 NULL을 반환한다.

 

 ex)


char arr[] = "blockdmask";
memset(arr, 'c', 5 * sizeof(char));
print(arr);

 

이런식으로
첫번째 인자에는 변경하고자 하는 목적지의 첫번째 주소(포인터)를 넣고,
두번째 인자에는 변경하고자 하는 값 'c'를 넣어준다.
그리고 마지막 인자에는 변경하고자 하는 길이 5를 넣고 char 배열이 들어왔으므로 char 타입의 바이트 크기를 계산해서 곱해주면 끝!

 

 

2. C언어, C++ memset 함수 예제


예제1) 문자 배열 변경

 

1
2
3
4
5
6
7
8
9
10
11
12
#include<string.h> // #include<memory.h> 도 괜찮습니다.
#include<stdio.h>
 
int main(void)
{
    char arr1[] = "blockdmask blog";
    memset(arr1, 'c', 5 * sizeof(char));
    printf(arr1);
 
    return 0;
}
 
cs

 

 배열 "blockdmask blog"에서 앞자리 5자리가 'c' 값으로 초기화 된 것을 볼 수 있다.

 

예제2) 배열 초기화 for문과 memset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<memory.h> //#include<string.h>
#include<stdio.h>
 
void printAll(int* pArr, int len)
{
    for (int i = 0; i < len; ++i)
    {
        printf("%d ", *(pArr + i));
    }
 
    printf("\n\n");
}
 
int main(void)
{
    // 배열 초기화 for 문 이용
    int arr1[20];
    for (int i = 0; i < 20; ++i)
    {
        arr1[i] = 0;
    }
 
    printf("for    : ");
    printAll(arr1, 20);
 
 
    // 배열 초기화 memset 함수이용
    int arr2[20];
    memset(arr2, 0, 20 * sizeof(int));
 
    printf("memset : ");
    printAll(arr2, 20);
 
    return 0;
}
 
 
cs


이렇게 배열을 0으로 초기화를 해야할때 for 반복문을 이용하기도 하는데!!

이렇게 memset 함수를 이용해서 초기화 할 수 도 있다!

 

예제3) 주의 사항

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<memory.h>
#include<string.h> // 둘다 포함해도 노상관
#include<stdio.h>
 
int main(void)
{
    int arr[5];
    
    // 0 이 아닌 다른 값으로 세팅
    memset(arr, 1, sizeof(arr));
 
    for (int i = 0; i < 5; ++i)
    {
        printf("%d ", *(arr + i));
    }
    
    return 0;
}
 
 
cs

결과에서 보셨듯이 0이 아닌 int 타입의 숫자를 넣게되면 예상할 수 없는 값으로 세팅 된다.

그 이유는 memset 함수는 1 바이트 단위로 값을 초기화 하기 때문이다.

1바이트 단위로 1를 만들었기 때문에 4바이트로 표현된 int 숫자 1은 제대로된 숫자로 표현될 수 없다.

0은 4바이트든 1바이트든 0 이기 때문에 동일한 결과값을 기대할 수 있던 것!

 

결론적으로
0 이아닌 그리고 char 타입이 아닌 값을 넣어서 세팅 하려고 할때는 우리가 원하는 값으로 세팅할수 없다.
0이랑 char 타입만 사용해야함.


그렇기 때문에 memset 함수는 보통 문자열(char 배열)에서 값을 변경하거나, 숫자배열을 0으로 세팅할때 사용한다.

 

'공부 STUDY > C | C++' 카테고리의 다른 글

[ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식  (0) 2023.01.28
[C] fgetc() 함수의 반환값은 int  (0) 2022.12.03
[C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당  (1) 2022.11.29
[C] 메모리 구조 | 스택, 힙, 데이터영역 | stack, Heap, Data  (0) 2022.11.29
[C언어] 헷갈리는 getchar() 함수 이해하기  (0) 2022.11.24
  • 메모리를 초기화 해줄 수 있는 memset() 함수
  • 1. C언어, C++에서의 memset 함수
  • 함수 원형void* memset(void* ptr, int value, size_t num);
  •  ex)
  • char arr[] = "blockdmask";memset(arr, 'c', 5 * sizeof(char));print(arr);
  • 예제1) 문자 배열 변경
  • 예제2) 배열 초기화 for문과 memset
  • 예제3) 주의 사항
'공부 STUDY/C | C++' 카테고리의 다른 글
  • [ C ] 겨울방학동안 C 포인터/ 구조체/ 동적메모리 개념 확실하게 익히기 | 자료구조 학습전 갖추어야할 베이스지식
  • [C] fgetc() 함수의 반환값은 int
  • [C] 동적 메모리 | malloc(), calloc(), realloc() 함수를 이용한 동적 메모리 할당
  • [C] 메모리 구조 | 스택, 힙, 데이터영역 | stack, Heap, Data
CHANGEL
CHANGEL
NOT GIVING UP | SOLID BASICS

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.