본문 바로가기

c6

[C] write하고 read하면 결과가 제대로 안 나온다? int main(){ int fd; char *buf; char str[5] = "hello"; fd = open("abc.txt", O_RDWR); printf("fd: %d \n", fd); int j = write(fd, str, 5); printf("write return : %d\n", j); int i = read(fd, buf, 5); printf("read return: %d %s\n",i,buf); exit(0); } 왜 write하고 read하면 write는 fd에 잘 들어가는데 read는 하지 못하는가,,, ❗️❗️❗️❗️❗️❗️❗️ write한 후 fd를 닫지 않으면 fd는 open된 상태이기 때문에 EOF 조건에 충족하지 않았다고 판단(어? 파일 열려있는데 아직 쓰고 있을지도 몰라.. 2023. 2. 28.
[c] 메모리 누수(memory leak)/다른 에러들 점검 방법 c로 코딩을 할 때는 아주 골치 아픈 일 중 한가지가 memory leak, 즉 메모리 누수를 잡는 것이라고 생각한다. 사실 간단한 코딩을 할 때는 누수를 잡지 않아도 코드 실행 상에는 아무런 문제가 없다. 그렇지만 메모리 할당 해제를 해주지 않는다면 어디선가 자원 낭비가 되고 있다는 것이기에 메모리 누수를 잡아주어야 한다. 메모리 누수를 탐지하는 것은 1번보다 2번에서 잘 나오긴 한다. 그래서 메모리 누수를 보고싶을 때는 2번을 사용하고 어디선가 segment fault가 나오거나 다른 에러들이 나올 때 1번을 사용해서 찾으면 좋다. memory leak을 잡을 때 아주 유용하게 사용하는 방법이 두 가지 있다. 1. 컴파일 할 때 플래그 넣어주기 보통 gcc로 컴파일을 할텐데 그 때 -fsanitize.. 2023. 2. 19.
[c] 메모리 구조 TEXT 코드 영역 ⇒ 프로그램을 실행시키기 위해 구성되는 것들 저장 제어문, 함수, 상수 DATA 프로그램(메인함수) 실행 전에 선언되어 프로그램이 끝날 때까지 저장 전역변수, 정적변수 저장 더 세분화하면 초기화 된 변수/초기화되지 않은 변수 영역으로 나뉨 HEAP 사용자에 의해 관리되는 영역 동적할당된 변수 낮은 주소에서 높은 주소로 저장 STACK 함수 호출 시 변수들 저장 지역변수, 매개변수 함수가 종료되면 그 함수에 할당된 변수들을 메모리에서 해제 높은 주소에서 낮은 주소로 저장 stack의 사이즈는 윈도우는 1MB, 리눅스는 8MB heap영역과 stack영역을 합쳐 잔여 램만큼의 공간 할당 가능 stack - 높은 주소부터 offset과 같이 쌓임 ⇒ 속도 빠름 - 크기가 작음 heap - .. 2023. 2. 19.
[C] free할 때 주의할 점 free가 동적할당된 메모리를 free해준다는 개념은 알고 있었는데 자세하게 이해하고 있지는 않았다. 그래서 아래와 같은 코드를 작성했다. #include #include int main(void) { char *str = (char *)malloc(sizeof(char) * 40); char *result; for (int i = 0; i < 5; i++) { str[i] = i + '0'; printf("%c\n", str[i]); } result = str; free(str); for (int i = 5; i < 10; i++) { result[i] = i + '0'; printf("%c\n", result[i]); } return ('a'); } str에 동적할당을 해주고 result에 str을 .. 2022. 12. 28.