다시 오신 걸 환영해요 이번 강의에서는 이전 과제에 대한
데모를 보여드리려
합니다 이 강의에서는 말로크를 이용해 메모리를 동적으로
할당하는 법을 배웠죠
키보드로 간단하게 읽고 문자열을 디스플레이
하는 것입니다 동적으로 할당된 포인터들과
캐릭터 포인터들을 이용할 것이고요
코드 블록을 불러와 새 프로젝트를 만들죠
동적 메모리 할당의 이름을 예제로 정할게요
동적 메모리 할당을 사용할 때
가장 먼저 할 일은 표준 lib를 포함하는지 확인하는 거예요
다행히 코드 블록에서 프로젝트를 생성하면
자동으로 포함시켜요
하지만 표준 해협어를 포함해야 하는 이유는 해협의 기능이
거기 있기 때문이에요 기억상실은 메모리를 할당하는
주요 기능이에요 굳은살도 있어요
Calloc은 정말 중요해요
몇 바이트가 필요한지 잘 계산하거든요 매개
변수가 2개니까요
하지만 Calloc의 진짜 장점은 모든 데이터를 0으로 초기화한다는
거죠 int 같은 경우에요 아주 멋진 기능이죠
다시 돌아왔네요 Realloc은 이미 할당된 메모리를
확장하죠 포인터로 전달하는 거죠
포인터에서 얼마나 많은 메모리를 할당받을 것인지
결정하고 새로운 메모리 위치에 있는 모든 것을 복사합니다
얼마나 많은 바이트를 할당할지도 지정합니다
새 메모리 위치에 추가합니다 아주 멋진 기능이에요
하지만 몰록을 이용해서 메모리를 정수용으로 할당할 때는 얼마만큼의
메모리를 할당할지 결정해야 합니다 하지만 보통 사이즈는
오브 연산자를 사용하세요
자, 시작해보죠
메인 메서드에서 정수를 만들겠습니다 그리고 그냥
크기로 하겠다고 하죠 런타임에 할당할 바이트의 크기를
입력합니다 크기를 저장하는 것이죠
제가 만들고 싶은 다른 것은 char 포인터를 만드는 것입니다.
이건 텍스트가 될 거에요. 이걸 null로 초기화할게요
아무것도 가리키지 않으니까요
가장 먼저 할 일은 사용자에게 크기를 입력하라고 요청하는 거예요
printf를 입력하고
엔터를 입력하고 텍스트를 입력하죠
그리고 몇 바이트에 대한 숫자를 입력합니다 즉, 문자 수를
할당해야 한다는 것이죠
그런 다음 scanf를 써서 읽어올 거예요
Scanf, 첫 번째 매개 변수는 데이터 유형의 형식 지정자 유형이죠
이건 %d가 될 거예요 정수를 읽고 있으니까요
Scanf는 포인터를 받아요
포인터를 취하는 함수가
있죠 전달할 주소가 필요해요
크기를 전달하는 경우 연산자 주소를 사용하지 않는 한 사이즈는 주소가 아니죠
ampersand를 선택하고 사이즈를
선택하겠습니다 바이트의 수를 읽을 수 있죠
바이트를 지정하면 이제 말로크 함수를 이용해 메모리를 할당할 수 있어요
무당벌레가 공백 포인터로 반격할 거예요
포인터는 새로 할당된 메모리에 대한
첫 번째 주소가 되고요 텍스트에 할당할 수 있어요
왜냐하면 문자는 포인터거든요
반환된 이 새 주소로 텍스트를 가리키고 싶어요
말코손바닥사슴이 빈 곳을 물어다 주기 때문에 낚싯줄을 던져야 해요
우리가 지적하고 있는 데이터의 타입은 문자입니다. 그래서 char**라고 하고 싶어요.
그리고 간단하게 함수를 호출할 수 있죠.
말코손바닥사슴 함수는 바이트 수를 차지해요
그리고 바이트를 입력하면 몇 바이트만
할당할 거예요 하지만 데이터의 종류에 따라 다르겠죠
데이터의 종류는 2바이트나 4바이트일 거예요
10글자를 할당하고 싶다면
10글자를 char의
2배로 곱하세요.
이제 n 곱하기
크기 of을 하죠 사이즈오프 연산자는 말로크 함수에 자주 사용됩니다
왜냐하면 머신 독립적이기 때문입니다 얼마만큼의
할당을 해야 하는지 알려주기 때문이죠
이건 정수와 더 관련이 있어요 시스템에 따라 정수를 표시하는
걸 기억하세요 어떤 아키텍처에서 사용하느냐에
따라 정수는 4 바이트로 나타나요 보통은 2나
4 바이트죠
1개의 정수를 저장하고 싶다고 하면 4바이트의
메모리를 생성할 것입니다. 만약 2바이트라면 이 설정은
맞지 않을 수도 있어요.
항상 몇 개의 정수나
몇 개의 문자를 만들고 싶은지 정하고 시스템에서
문자 크기로 곱하세요 Sizeof연산자는 챠트가 차지하는
바이트를 알려주죠 10개의 chars를 생성하고 싶다면
10배의 chars 크기로 설정하세요. 10개의 정수를 만들어 10개의
정수를 저장하려면 int의
10배 크기라고 하세요 정말 중요하죠
호출성 함수를 사용하면 그럴 필요가 없어요 캘록은 두 가지 매개
변수가 필요해요 첫 번째 매개 변수는
포인터인 것 같고 두 번째 매개
변수는 바이트 크기예요
24 int라고 하면 24만 전달하고 자동으로
할당하면 돼요
따라서 칼슘은 아주 유용한 도구입니다 곱셈을 할 필요는 없거든요
캘록의 경우 첫 번째 매개 변수는 크기예요
10 int를 생성하고 싶다면 그냥 10을 넘기면 돼요
두 번째 매개 변수는 바이트의
크기인데요 곱셈은 안 하셔도 돼요 수고를 좀 덜어주죠
이제 메모리를 할당했으니 텍스트를
참조 해제하기 전에 텍스트가 Null이 아닌지 확인해야죠
그래서 항상 텍스트가 아닌 부분에 랩을 하면 Null이 아니라고
말해주죠 아니면 텍스트가 Null과 같지 않으면
명시적으로 말하면 돼요
전 항상 그렇게 해요 포인터를 참조에서
해제하는 건 아주 위험하거든요
무슨 일이든 일어날 수 있죠 데이터를 쓸 수 있을지도 몰라요
빠져들어요 다른 곳에 메모리를 남기는 거죠 그래서 프로그램이
엉망이 되거나 세분화 결함이나 프로그램이 중단될 수 있죠
하지만 메모리를 할당하는
한 데이터를 읽을 수 있어요
Git s나 scanf를 사용할 수 있어요.
하지만 여러분이 할 일은 프린트하고
텍스트를 입력하고 여기에 줄
피드도 추가하는 겁니다 읽기가 쉽도록요
scanf를 사용할게요. 익숙한 방식이니까요.
scanf는 퍼센트로 판독되고요.
사실 제가 마술을 하나 보여 드릴게요
scanf를 사용해서 다음 문자를 읽을 거예요. 그래서
멈추고 gets를 사용해서 텍스트를 읽을 거예요.
get은 일반적으로 f get을 사용할 수 있는 함수죠 입력 스트림에 맞추기만
하면 돼요
하지만 get은 표준 입력 스트림에서 읽습니다 기본값은 키보드죠
Get이 포인터를 받네요 텍스트만 전달하면 됩니다 이미 포인터이기
때문에 연산자 주소를 입력할 필요는 없죠
겟시크스의 장점은 빈칸으로 나뉜 여러 문자열을 읽을 수 있다는 거죠
Get을 실제로 읽으면
프린트할 수 있어요 입력된 텍스트는 a Word
%s 백슬래시 n 그리고 쉼표
텍스트죠 문자는 포인터예요
Printf는 포인터를 받죠 삭제할 필요 없어요
텍스트를 디스플레이하면 텍스트는
포인터의 값을 디스플레이하는데 포인터는 주소가 되죠
텍스트가 가리키는 것의 값을 표시하고 싶어요
그럼 끝이에요 아뇨, 아직 안 끝났어요 자유라고 외치고 싶어요
포인터를 풀어주고 싶어요
퇴장할 때 메모리는 자유가 되지만요 자유가 되도록 해야 합니다 그런
다음 안전을 위해 텍스트를 null과 동일하게 설정해야죠
계속해서 빌드하고 어떻게 되는지 보죠
올바른 변수를 읽지 않아서 문제가
있어요
올바른 변수를 사용하지 않아요 크기를 사용하고 싶어요
괜찮은 것
같네요
여기서 차이점은 텍스트를 참조 해제할 필요가 없다는
거죠 텍스트는 문자 포인터니까요
포인터에 있는 경우에만 레퍼런스를 해제하면 돼요 %s를 사용하면
자동으로 캐릭터 포인터를 참조 해제하는
걸 알아요
캐릭터 포인터를 다른 포인터와 비교할 때 그게
한 가지 차이점이죠 다른 포인터는 값을 얻기
위해 참조를 해제해야 합니다 문자열을 문자열
배열 등에 복사할 순 없으니까요
* 텍스트는 절대 할 수 없어요. 텍스트를
복사하고 싶다면 항상 str 카피를 사용해야 해요.
강의에서 배웠듯이 데이터를 배열에
할당할 순 없죠 캐릭터 포인터가 배열이에요
제대로 된 것 같네요 참조할 필요가 없죠
이걸 만든 다음 실행하고 싶어요
텍스트의 한계를 넣은 게 보이실 거예요
jason 5, 6을 입력하면 input이 jason이라고
프린트되죠
이 프로그램으로 할 수 있어요 하지만 여기서 얻을 수 있는 교훈은
말레이시아어를 할 때 표준 립스틱을 사용하세요
캐릭터 포인터를 null로 초기화하세요 &를 써서 스캔하세요
크기는 신호가 아니니까요
낚싯대를 던지면 아무것도 안 잡혀요 낚싯대를 던져야 해요
망둑어 안에 넣고 싶잖아요 할당하고 싶은 것에 대한
크기로 연산자를 정하세요 곱하기, 문자 개수와
정수요 캐릭터용 정수와 프리미티드
데이터 타입에도 적용할 수 있죠 크기만 정하면 돼요
항상 Null인지 확인하고 Null이 아닌지 확인하세요
문자열을 사용할 때요
그런 다음 텍스트를 입력해 get에 저장하고 프린트하죠
마지막으로 포인터를 풀어줘야 합니다 그래야 힙에 되돌려줄
수 있으니까요 도움이 됐으면 좋겠네요 고마워요