메모리 (2)

khxxjxx·2021년 4월 21일
0

강좌 : 부스트캠프 모두를 위한 컴퓨터과학(cs50 2019)

4. 메모리

✍메모리구조

메모리저장값
machine code컴파일된 바이너리
globals프로그램 안에서 저장된 전역변수
heap


쌓이면서 저장


stack
malloc으로 할당된 메모리의 데이터




프로그램 내의 함수와 관련된 것들
  • 힙 영역에서는 malloc에 의해 메모리가 더 할당될수록 점점 사용하는 메모리의 범위가 아래로 늘어난다
  • 스택 영역에서도 함수가 더 많이 호출 될수록 사용하는 메모리의 범위가 점점 위로 늘어난다
  • 이렇게 점점 늘어나다 보면 제한된 메모리 용량 하에서 기존의 값을 침범하는 상황도 발생하는데 이를 힙 오버플로우 또는 스택 오버플로우라고 말한다

✍️파일쓰기

사용자에게 입력받기

scanf : 사용자로부터 형식지정자에 해당하는 값을 입력받아 저장하는 함수

  • get_int 코드
#include<stdio.h>

int main(void)
{
    int x;
    printf("x: ");
    scanf("%i", &x);  // 스택 영역안에 s가 저장된 주소로 찾아가 입력한 값을 저장
    printf("x: %i\n", x);
}
  • get_string 코드
#include<stdio.h>

int main(void)
{
    char s[5];
    printf("s: ");
    scanf("%s", s);  // 크기가 5인 char자료형의 배열로 정의했기 때문에 그대로 입력
    // 컴파일러는 문자배열의 이름을 포인터처럼 다룸
    printf("s: %s\n", s);
}

파일저장하기

  • fopen 함수를 이용하면 파일을 FILE이라는 자료형으로 불러올 수 있다
  • fopen함수의 첫번째 인자는 파일이름, 두번째 인자는 모드로 r은 읽기, w은 쓰기, a는 덧붙이기를 의미
#include<stdio.h>
#include<cs50.h>
#include<string.h>

int main(void)
{
    // 파일 열기
    FILE *file = fopen("phonebook.csv", "a");  // csv : 쉼표로 분리된 값(엑셀 등)
    
    // 사용자에게서 문자열을 입력받기
	char *name = get_string("Name: ");
	char *number = get_string("Number: ");
    
    // 파일에 출력
	fprintf(file, "%s,%s\n", name, number);
    
    // 파일 닫기
	fclose(file);  // 작업이 끝난 후에는 파일에 대한 작업을 종료
}

✍️파일읽기

fread : 배열, 읽을 바이트 수, 읽을 횟수, 읽을 파일
char값의 범위 : -128 ~ 127
unsigned값의 범위 : 0 ~ 255

#include<stdio.h>

int main(int argc, char *argv[])
{
    // 만약 2가 아니라면 파일명이 입력되지 않았거나 파일명 외의 다른 인자가 입력
    if (argc != 2)  
    {
        return 1;  // 1(오류)을 반환하고 프로그램 종료
    }
    
    // 파일 열기
    FILE *file = fopen(argv[1],"r");
    if (file == NULL)
    {
        return 1;
    }
    
    // 파일에서 3bytes 읽기
    unsigned char bytes[3];  // -128부터 127이 아닌 0부터 255범위의 값을 의미
    fread(bytes, 3, 1, file);
    
    // 모든 jpeg의 첫 세바이트는 무조건 ff,d8,ff로 시작
    if (bytes[0] == 0xff && bytes[1] == 0xd8 && bytes[2] == 0xff)
    {
        printf("Maybe\n");
    }
    else
    {
        printf("No\n");
    }
    
    // 파일 닫기
    fclose(file);
}
profile
코린이

0개의 댓글