본문 바로가기

cs78

6: 자료구조-1(malloc과 포인터 복습) int main(void) { int *x; int *y; x = malloc(sizeof(int)); *x = 42; *y = 13; } - main 함수 안에 첫 두 줄에서는 포인터 x와 y를 선언 - x에 malloc 함수를 이용해서 int 자료형 크기(4바이트)에 해당하는 메모리를 할당 - *은 역참조 연산자로 그 주소로 가라는 의미! - 다음에는 x와 y 포인터가 가리키는 지점에 42와 13을 저장함, 여기서 y는 포인터로만 선언되었을 뿐이지, 어디를 가리킬지에 대해서는 아직 정의가 되지 않았기 때문에 *y = 13은 문제가 됨 - 초기화되지 않은 y는 프로그램에서 임의로 가리키고 있는 곳에 13이라는 값을 저장하는 것이 오류를 발생시킴 -> y = x;라는 코드를 더해주면 y는 x가 가리키는 .. 2021. 12. 11.
5: 메모리-6(파일 쓰기와 읽기) Heap 영역에서 malloc에 의해 메모리가 더 할당될수록, 화살표 방향으로 메모리의 범위가 커지게 됨 마찬가지로 스택 영역에서도 함수가 많이 호출될수록, 사용하는 메모리의 범위가 점점 위로 늘어남 이렇게 늘어나다 보면 제한된 메모리 용량 안에서 기존의 값을 침범하는 상황도 발생하는데 이를 힙 오버플로우 스택오버플로우라고 함 버퍼 오버플로우: 컴퓨터가 너무 많은 메모리를 써서 파일이나 사진이 열리지 않거나 화면이 정지하거나 아예 작동하지 않는 상황이 생기는 것 스택 오버플로우와 힙 오버플로우로 나뉨 스택 오버플로우: 스택 영역을 넘어 데이터가 저장되는 경우 - 함수의 재귀 호출이 무한 반복될 때, 스택 영역에 데이터가 계속해서 쌓이고 스택 영역을 넘어 데이터가 저장되면 프로그램이 종료 힙 오버플로우: .. 2021. 12. 6.
5: 메모리-5(메모리 교환, 스택,힙) swap 함수를 이용해서 x에 있는 값과 y에 있는 값을 교환하는 코드 작성 #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x is %i,y is %i\n",x,y); swap(x,y); printf("x is %i,y is %i\n",x,y); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } 함수 swap은 a와 b를 입력받아 그 값을 바꾸는 일을 수행 main 함수에서 x에 1, y에 2를 입력하고 swap 함수를 통해 두 값을 바꾸려고 하고 있음(x는 2로 y는 1로) 하지만 위 코드를 컴파일하고 출력하면 swap 함수를 거친 후에도 x와 y의 .. 2021. 12. 4.
5: 메모리-4(메모리 할당과 해제) 지난 시간에 malloc이라는 메모리 할당 함수를 이용해서 EMMA를 복사하는데 필요한 메모리 공간을 할당받고 for 루프를 통해 문자열을 복사했음 malloc의 반대는 free라는 함수 "free": 할당되었던 메모리를 다시 반환해서 프로그램이 더 많은 메모리를 사용할 수 있게 함 malloc 함수를 이용해 메모리를 할당한 후에는 free라는 함수를 이용해 메모리를 해제해줘야 함 그렇지 않을 경우 메모리 저장한 값은 쓰레기 값으로 남게 되어 메모리 용량의 낭비가 발생하고 이러한 현상을 '메모리 누수'라고 함 valgrind라는 프로그램을 사용하면 작성한 코드에서 메모리와 관련된 문제가 있는지를 쉽게 확인할 수 있음 help 50 valgrind ./filename 이와 같은 명령어를 사용하면 filen.. 2021. 12. 3.
5: 메모리-3(문자열, 문자열의 비교와 복사) 문자열 여태까지 문자열을 저장하기 위해 cs50 라이브러리에 포함된 string 자료형을 사용하였음 string s = "EMMA"; 문자열은 결국 문자의 배열이고, s[0], s[1], s[2], s[3]와 같이 하나의 문자가 배열의 한 부분을 나타냄 마지막의 \0은 0으로 이루어진 바이트(1바이트)로, 문자열의 끝을 표시하는 약속(널 종단 문자) 여기서 변수 s는 문자열의 첫 번째 글자를 가리키는 포인터가 됨(주소 0x1234에 있는 s[0]을 가리킴) 그러면 컴퓨터는 널 종단 문자를 마주칠 때까지 루프를 돌면서 끝을 알아냄 결국 문자열은 문자 배열의 첫 번째 바이트 주소가 됨 그리고 마지막 바이트에는 \0을 저장해 끝을 알려줌 실제 cs50 라이브러리를 보면 string 자료형은 아래와 같이 저장되.. 2021. 12. 3.
5: 메모리-2(포인터) #include int main(void) { int n = 50; int p = &n; } p라는 새로운 변수를 선언(n의 포인터라는 의미로)하고 그 안에 n의 주소를 저장함 어떤 변수에 주소를 저장하고 싶다면 그 변수의 자료형뿐만 아니라 별 연산자 또한 써줘야 함 int main(void) { int n = 50; int *p = &n; } 포인터 = ' * ', 이 연산자는 어떤 메모리 주소에 있는 값을 받아오게 해 줌 ' * '를 이용해서 포인터 역할을 하는 변수를 선언할 수 있음(변수 p) *p라는 포인터 변수 앞의 int는 이 포인터가 가리키는 값이 int라는 뜻(*p가 가리키는 주소가 n인데 n은 int형) 다른 float나 char 등 다양한 자료형에 대한 포인터도 있음 p를 출력하기 in.. 2021. 12. 2.