[C언어 스터디 - 06] 구조체 멤버값 설정 (memset)
2020. 6. 26. 11:00ㆍ03. Resources/C, C++
728x90
반응형
구조체와 메모리 활용하기
참고 문헌 (Ch 52): https://dojang.io/mod/page/view.php?id=438
구조체와 메모리를 간단하게 0으로 설정하기
구조체 변수나 메모리의 내용을 한꺼번에 값을 설정하려면 memset 함수를 사용
memset(구조체 포인터, 설정할 값, sizeof(struct 구조체이름))
예시 - 구조체 변수를 이용
#include <stdio.h>
#include <string.h> // memset 함수가 선언된 헤더 파일
struct Point2D {
int x;
int y;
};
int main()
{
struct Point2D p1;
memset(&p1, 0, sizeof(struct Point2D)); // p1을 구조체 크기만큼 0으로 설정
printf("%d %d\n", p1.x, p1.y); // 0 0: memset을 사용하여 0으로 설정했으므로
// x, y 모두 0
return 0;
}
예시 - malloc으로 만들어진 배열을 이용
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
#include <string.h> // memset 함수가 선언된 헤더 파일
struct Point2D {
int x;
int y;
};
int main()
{
struct Point2D *p1 = malloc(sizeof(struct Point2D)); // 구조체 크기만큼 메모리 할당
memset(p1, 0, sizeof(struct Point2D)); // p1을 구조체 크기만큼 0으로 설정
printf("%d %d\n", p1->x, p1->y); // 0 0: memset을 사용하여 0으로 설정했으므로
// x, y 모두 0
// 출력: 0 0
// 0 이 아닌 값을 넣는 경우 => 값이 이상한 것 같음
memset(p1, 1, sizeof(struct Point2D));
printf("%d %d\n", p1->x, p1->y);
// 출력: 16843009 16843009
memset(p1, 2, sizeof(struct Point2D));
printf("%d %d\n", p1->x, p1->y);
// 출력: 33686018 33686018
free(p1); // 동적 메모리 해제
return 0;
}
구조체와 메모리 복사하기
아주 중요한 기능!!
이미 생성하여 값을 저장한 구조체나 메모리를 다른 곳에 복사할 경우 이용
memcpy( 목적지포인터 , 원본포인터 , 크기); => 목적지 포인터를 반환
#include <stdio.h>
#include <string.h> // memcpy 함수가 선언된 헤더 파일
struct Point2D {
int x;
int y;
};
int main()
{
struct Point2D p1;
struct Point2D p2;
p1.x = 10; // p1의 멤버에만 값 저장
p1.y = 20; // p1의 멤버에만 값 저장
memcpy(&p2, &p1, sizeof(struct Point2D)); // Point2D 구조체 크기만큼 p1의 내용을 p2로 복사
printf("%d %d\n", p2.x, p2.y); // 10 20: p1의 내용을 p2로 복사했으므로 10 20
return 0;
}
// 사이즈가 같은 경우 위와 같이 되는데 다른 경우는 어떻게 될까?
복사하는 포인터와 목적지 포인터의 사이즈가 다를 경우
#include <stdio.h>
#include <string.h> // memcpy 함수가 선언된 헤더 파일
struct Point2D {
int x;
int y;
};
struct Point1D {
int x;
};
struct Point3D {
int x;
int y;
int z;
};
int main()
{
struct Point1D p1;
struct Point2D p2;
struct Point3D p3;
p2.x = 10; // p1의 멤버에만 값 저장
p2.y = 20; // p1의 멤버에만 값 저장
memcpy(&p1, &p2, sizeof(struct Point1D)); // Point2D 구조체 크기만큼 p2의 내용을 p1로 복사
printf("%d \n", p1.x); // 10: p2의 내용을 p1로 복사, 한 칸만 복사했으므로 10
memcpy(&p3, &p2, sizeof(struct Point3D)); // Point2D 구조체 크기만큼 p2의 내용을 p3로 복사
printf("%d %d %d\n", p3.x, p3.y, p3.z); // 10 20 10: p2의 내용을 p3로 복사 3칸을 복사했는데, 부족한지 맨 첫 값이 다시 나옴
// 그 외에도 메모리 사이즈가 작은 데이터를 큰 데이터로 옮기는 경우, 해당하는 범위를 넘어서면 원래 값이 남아있다.
return 0;
}
반응형
'03. Resources > C, C++' 카테고리의 다른 글
[C언어 스터디 - 08] 열거형 (enum)] (0) | 2020.06.28 |
---|---|
[C언어 스터디 - 07] 구조체 배열 (struct array) (0) | 2020.06.27 |
[C언어 스터디 - 05] 구조체와 포인터 (struct and pointer) (0) | 2020.06.25 |
[C언어 스터디 - 04] 구조체 (struct) (0) | 2020.06.24 |
[C언어 스터디 - 03] 배열과 포인터 (array and pointer) (0) | 2020.06.23 |