소개
게시글
질문&답변
2022.11.23
(1:40) flexible array member을 갖는 구조체, 스택 vs 힙 메모리 위치가 궁금합니다.
아....! 이해했습니다.스택에는 '구조체에 접근하기 위한' 포인터만 공간을 갖고있고구조체 변수 또는 포인터가 선언되는 순간 구조체의 멤버들에 메모리 공간이 할당됩니다.struct flex pf; 이렇게 선언됐다면 스택에 구조체 멤버들을 위한 공간이 확보되겠지만, (block scope에 입력된 구조체의 경우)※file scope에 입력된 구조체라면, 초기화 여부에 따라 BSS또는 DATA Segment에 저장.struct flex *pf; 이렇게 선언하면 스택에는 포인터를 위한 공간이 일단 확보되는데,1) 구조체가 file scope에 입력됐다→ 구조체는 초기화 여부에 따라 BSS 또는 DATA Segment에 저장2) 구조체가 함수 내에 입력됐다. (이번 예제)2-1) 그런데 구조체 포인터가 힙으로부터 동적할당받은 메모리를 가리킨다.→ 구조체는 힙(heap) 메모리 공간을 할당받아 저장2-2) 구조체 포인터가 그냥 선언만 됐다.→구조체는 스택에 메모리 공간을 할당받아 저장그러니까 이번 예제는 스택에는 포인터 pf에 대한 공간만 잡혀있고힙에는 구조체 flex의 전 멤버에 대한 공간이 잡혀있는 것입니다.위에 제가 이해한 내용이 맞을까요?
- 0
- 1
- 375
질문&답변
2022.11.20
(강의10:01) 런타임 에러 발생하는 이유
고민해보고 원인을 찾았습니다.헤더파일 를 포함하지 않았습니다.포함시켰더니 정상적으로 작동은 잘 됐는데..그렇다고 하더라도1. 를 포함하지 않았음에도 strchy( )함수가 포함된 것을 컴파일러가 걸러주지 못한 이유는 무엇인가요?2. 만약 내부적으로 어떠한 라이브러리에 링킹이되어서 strchr( )함수가 있음에도 위처럼 정상적으로 빌드가 되었다고 하겠습니다.그렇다고 하더라도 strchr( )함수는 char* 타입을 반환하므로 수정이 가능하지 않나요?따라서 초기값 "Empty"를 수정할 수 있으니까 새로운 입력값에서 \n을 찾아서 포인터를 find에 대입하고, 그것을 \0으로 바꿔줄 수 있는 것일텐데..왜 정상적으로 빌드되었는지 모르겠습니다.*저는 visual studio2022버전을 사용중입니다.
- 0
- 1
- 315
질문&답변
2022.10.06
(13:05) 콘솔 창에 숫자와 문자를 섞어 입력했는데, 정상적으로 받아들입니다.
(사진)자세한 설명 감사합니다.인터넷에서 suffix에 대한 개념을 찾아봐도 아직 잘 모르겠습니다..ㅠㅠ예전에 강의에서 코드 작성 창에서 float형 자료의 경우 값을 대입할 때, 뒤에 f를 입력해줬던 것이 접미사(suffix)의 개념이었다는 것은 인지하고 있으나, (+작성한 코드를 빌드 시 컴파일러가 suffix로 인식한다는 것으로 이해하고 있습니다.)콘솔 창에서 입력한 9094h의 경우 여기서 h가 suffix로 인식된다는 것은 잘 이해가 되질 않습니다.------------------------------다만, 제가 그 다음 강의 8.7 입력스트림과 숫자 를 듣고 이해하기로는, 위에 첨부한 사진의 콘솔 창 실행 결과와 같이 숫자+문자의 경우ex) 9094h를 콘솔창에 입력했다고 가정하겠습니다.get_long함수 내에 있는, (빈칸을 '입력을 다 완료했구나'라고 인지하는) scanf함수가 맨 처음 숫자 9094를 정상적으로 숫자로 받아들입니다. → 따라서 "Your input 9094 is an integer. Thank you." 라고 출력그 다음 (숫자와 문자 사이 빈칸이 있든 없든 간에: 12321 dfasd처럼 빈칸이 있다면 scanf함수가, '입력이 완료됐구나' 라고 인지할 것이고/9094h와 같이 빈칸이 없다면 문자를 인식하여 '숫자가 아니네, 입력이 완료됐구나' 라고 인지할 것입니다)※사실 나중에 인식되는 '문자'를 char타입으로 받아들여 이것을 ASCII Code를 통한 숫자로 변환이 가능하지 않을까 싶기도 하지만, 애초에 형식 지정자를 %ld로 입력했을 때, 숫자+문자의 경우는 맨 처음 이미 숫자가 정상적으로 입력이 된 상태인데, 문자 입력이 들어왔다면? 이것을 컴파일러가 (문자→숫자 변환과정을 적용할 수 없는) 정상적이지 못한 '숫자입력을 끝내는' 신호라고 받아들일 것이라고 생각합니다. [문자+숫자의 경우 처음 입력되는게 '문자'이기에 말씀하신 것처럼 처음부터 입력서식이 맞지 않아 정상적으로 입력x]: 따라서 '정상적으로 입력되지 못한' 숫자+문자에서의 뒤 문자는 버퍼에 저장이 되었다가, "Your input - h - is not an integer. Please try again."를 출력할 것입니다.앞 강의에서 이해한 내용을 바탕으로 작성하다보니 글이 너무나 길어졌는데, 시간이 걸리더라도 차분히 읽어봐주셔서 제가 완벽히 이해한 것인지... 확인해주신다면 정말 감사하겠습니다.(사진)※※※ 제가 처음 드린 질문에서 9094h 입력에 대해 콘솔창이 "Wrong input. Please try again"를 출력하지 않은 것은, get_long함수에서 마지막에 input을 리턴하지 않았기 때문입니다..ㅠㅠ문제 파악을 헷갈리게 해드린 것 같아 정말 죄송합니다...ㅠㅠ
- 0
- 2
- 802
질문&답변
2022.10.04
(1:24) 제가 작성한 코드와 교수님께서 작성한 코드의 차이를 모르겠습니다.
해결했습니다.제가 작성한 코드대로 입력하면,i = 0으로 for문에 진입했을 때 그것을 i cr 출력 → j 순환 [이것을 전체 i 순환만큼 반복]하게됩니다.(사진)처음에 첫 for문의 중괄호를 없애고 두 for문의 위치를 동등하게 입력해보기도 했는데, 그래도 이것역시i 순환(cr출력) → j순환(줄바꿈)으로 잘못됐다는 것을 깨달았습니다.
- 0
- 1
- 214
질문&답변
2022.10.03
(2:49) 코드의 진행 방식이 머릿속에서 꼬여버려서 while문을 추가하였을 때, 정상적으로 출력되는 이유를 모르겠습니다.
버퍼에서 한번 읽어들이면 그 값은 사라진다.즉, while(2)문 continue; 블럭에서 앞 if문에서 처리한 첫 글자를 제외한 나머지 글자와 맨 마지막 \n까지 읽음으로서 버퍼에 남은 데이터를 전부 소모할 때까지 반복한다.따라서 다시 한번 '사용자의 입력없이' while(1)문을 반복할 필요도, "Current ~ (y/n)"을 출력할 필요도 없다.완벽히 이해했습니다..ㅠㅠ버퍼라는 개념 참 어려운 것 같습니다.
- 0
- 2
- 284