C언어

· C언어
1. 함수의 원형 malloc과 free 함수의 원형은 다음과 같다. void *malloc(unsigned int size); void free(void *p); malloc 함수의 반환형은 (void *) 형이라서 용도에 맞는 포인터 형으로 형 변환 후 사용해야 한다. 컴파일러 마다 자동으로 되는 것도 있지만 호환성을 위해선 꼭 해야 하는 과정이다. 2. 반환값이 널 포인터인지 반드시 확인하기 메모리 할당 함수는 원하는 크기의 공간을 할당하지 못하면 0번지인 널 포인터를 반환하게 된다. 이는 보통 NULL로 표기하는데 stdlib.h에서 매크로 정의로 0이라 되어 있기 때문에 전처리 과정에서 0으로 바뀐다. 즉 정수 0과 같다고 생각해도 된다. 그러나 널 포인터는 포인터의 특별한 상태를 나타내기 위해..
· C언어
int ary[3][4] 다음은 자료형이 int [4]이고 논리적으로 세 개의 일차원 배열을 요소를 갖는 2차원 배열이다. 여기에서 일곱 번째 물리적인 요소의 값에 접근하려면 먼저 포인터 연산을 할 것이기 때문에 정수 연산에 대해 변화하는 주소를 이해해야 한다. ary는 배열의 이름이자 이차원 배열의 첫 번째 부분 배열(ary[0])의 주소를 말한다. 그러므로 ary의 시작 주소를 100이라 가정하고, ary + 1처럼 정수 연산을 하게 되면 ary + 1 == ary + (1 * sizeof(ary[0])) == 100 + 16 == 116 이런 식으로 된다. 여기서 2를 더하면 바로 일곱 번째 요소에 접근할 수 있다고 생각할 수 있지만 (ary + 1) + 2로 하면 같은 원리로 ary + 3이 되어..
· C언어
Piscine 끝나고 C언어 책 목차를 쭉 보니까 4주 동안 이런걸 했었구나하는 생각이 든다. 생각 보다 굉장히 범위가 넓었던.... 하여튼 아직 15장을 보고 있으니 어서 끝내고 내가 하고 싶은 공부 이어서 해야지~~ 01-1 프로그램과 C 언어 01-2 컴파일과 컴파일러 사용법 02-1 C 프로그램의 구조와 데이터 출력 방법 02-2 상수와 데이터 표현 방법 03-1 변수 03-2 데이터 입력 04-1 산술 연산자, 관계 연산자, 논리 연산자 04-2 그 외 유용한 연산자 05-1 if문 05-2 if문 활용과 switch ~ case문 06-1 while문, for문, do ~ while문 06-2 반복문 활용 07-1 함수의 작성과 사용 07-2 여러 가지 함수 유형 08-1 배열의 선언과 사용 ..
· C언어
1. auto, register, static 예약어 종류 지역 변수 전역 변수 예약어 auto register static 없음 static 선언 위치 코드 블록 내부 함수 외부 사용 범위 선언 ~ 선언한 블록 끝 프로그램 전체 하나의 파일 내부 메모리 존재 기간 선언 ~ 선언한 블록 끝 프로그램 시작 ~ 종료 자동 초기화 없음 0으로 자동 초기화 메모리 위치 스택 영역 레지스터 데이터 영역 2. 지역 변수의 주소 반환 int *get_num(void) { int n; scanf("%d", &n); return (&n); } 이런 식으로 반환하게 된다면 지역변수의 주소를 반환하기 때문에 에러 메시지를 보낸다. 왜냐하면 이 작업 이후 get_num 함수가 종료되면 n이 할당받았던 메모리를 반환하게 되고,..
· C언어
문제를 풀면서 함수를 살펴 보겠습니다. 키보드로 입력한 단어의 길이가 5자를 넘는 경우 6자부터 별(*)을 출력하는 프로그램을 작성합니다. 단어의 최대 길이는 15자로 제한합니다. (실행창에 출력되는 결과는 제가 작성한 main 함수를 참고해주세요) #include intft_strlen(char *str) { intsize; size = 0; while (*str != '\0') { size++; str++; } return (size); } char*ft_strncpy(char *dest, char *src, unsigned int size) { char*po; intcount; count = 0; po = dest; while (*src != '\0' && size > count) { *dest++..
· C언어
배열의 문자열 초기화는 여러 가지 방법이 있는데 가장 대표적인 대입 연산자를 사용한 방법으로는 두 가지가 있다. 배열 요소에 하나씩 대입해가며 마지막에 널 문자까지 넣어주는 방법과 배열 선언과 동시에 바로 큰 따옴표를 이용해 문자열을 초기화하는 것이다. 하지만 여기서 유의할 점이 있다. C언어를 조금 공부해봤다면 다들 아시겠지만 문자열은 C언어 컴파일 과정에서 주소값을 반환한다. 그런데 배열 선언 동시에 초기화하는 것은 주소를 배열에 넣는 것이 아니라 각각 배열의 요소가 초기화되고 마지막에 널 문자까지 붙여준다. 결국 사진의 주석처럼 선언을 이미 한 이후 대입을 시도할 시 문자열의 첫 번째 문자의 주소(문자열이 임시로 저장되어 있는 배열의 첫 번째 요소의 주소)를 char형에 넣어버리는 것이고, str1..
· C언어
1. gets 함수를 사용한 문자열 입력 함수 원형 char *gets(char *str) gets 함수는 버퍼에서 개행 문자를 가져오지만 배열에는 널 문자로 바꿔 저장합니다. gets 함수도 scanf 함수처럼 입력한 문자열을 포인터 연산을 통해 배열에 저장합니다. 그래서 할당된 배열의 크기보다 큰 문자열을 입력하면 배열에 할당된 메모리 공간을 벗어나 저장하므로 주의가 필요합니다. scanf 함수는 white space인 스페이스, 탭, 엔터 키를 눌러도 계속 입력을 기다립니다. scanf에서는 이들을 문자열을 구분하는 용도로만 사용하고 실제 데이터로는 사용하지 않기 때문입니다. 그러나 gets 함수는 문자열의 일부로 입력받으므로 문자열 입력 없이 처음부터 enter를 눌러도 바로 입력을 끝냅니다. 이..
· C언어
문자열 상수는 값을 바꿀 수 없으므로 바꾸려면 char 배열을 선언해야 한다. scanf의 변환문자 %s는 공백 없이 연속된 문자열만 입력 받는다. 즉 중간에 있는 공백은 전부 무시하고 연속된 단어만 취급한다. 그리고 중간에 자동으로 널 문자를 붙여준다.
jayoon
'C언어' 카테고리의 글 목록