본문 바로가기

카테고리 없음

C언어 구조체 메모리 활용하기(초기화 0)

https://www.yes24.com/Product/Goods/117080938

C 언어 코딩 도장  - 예스24

프로그래밍은 연습으로 배우는 것이다!가장 깊이 있는 C 언어 입문서C 언어의 난해하고 까다로운 주제도 생략하지 않고 단계별로 차근차근 설명한다. 개념을 생략하고 쉬운 책이 되는 것보단 제

www.yes24.com

 
공부한 것을 정리한 내용입니다.
 
 
 
구조체의 메모리값을 0으로 설정하거나 초기화 할려면 memset(구조체포인터, 설정한 값, sizeof(struct 구조체)); 함수를 이용하면 된다.
 

#include <stdio.h>
#include <string.h> // memset 함수가 선언된 헤더파일

struct active {
  int x;
  int y;
};

int main(){
  struct active a1;

  memset(&a1, 0, sizeof(struct active)); // a1의 주소연산자를 사용하여 구조체 변수의 값을 0으로 설정

  printf("%d %d\n", a1.x, a1.y); // x,y 0으로 출력 

  return 0;
}

 
여기서 memset 함수를 이용해 구조체 변수의 값을 설정할 때는 &p1과 같이 주소연산자 &를 사용하여 변수의 메모리 주소를 구해서 넣어준다. 그리고 설정한 값과 크기 0을 넣어준다. 결과는 모두 0 이 출력해서 나온다.
 
 
 
또 다른 방법으로 일일이 주소를 넣어주는대신에 구조체 포인터를 할당해서 넣어준다 이때 포인터 안에 메모리 주소를 담고 있어서 &를 사용하지 않아도 된다.
 

#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더파일
#include <string.h> // memset 함수가 선언된 헤더파일

struct active {
  int x;
  int y;
};

int main() {
  struct active *a1 = malloc(sizeof(struct active));
  memset(a1, 0, sizeof(struct active)); // a1을 구조체 크기만큼 0으로 설정
  printf("%d %d\n", a1->x, a1->y); // 모두 0으로 출력
  free(a1); // 동적메모리 해제
  return 0;
}

 
이때 설정값(value)을 int 1(4byte)로 초기화하면 16843009 16843009 예상치 못한 값이 출력된다  memset함수안에 있는 value값이 unsigned char(1byte)값이 설정되있어서 1byte마다  int 1의 값(4byte)이  들어가면 0000 0001 0000 0001 0000 0001 0000 0001으로 표현되어서 16843009이 출력된 것이다.