묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 되새기는 C 프로그래밍
Hex Editor를 이용한 다국어 번역 관련 질문입니다
"문자(배)열 상수는 어디에 저장되는가?" 강의에서 마지막에 Hex Editor로 exe 파일의 static 영역에 있는 문자열 리터럴을 강제로 바꿔서 다국어 지원을 하게 했다는 이야기를 하셨는데요, 그 부분과 관련해 궁금한 점이 생겼습니다. 응용프로그램에서 static 영역의 메모리를 수정할 수는 있겠지만, 각 크기가 정해져있지 않나요? 예를 들어서 "Hello"를 "안녕하세요"로 변경하기에는 5 byte를 10 byte로 변경해야 한다는 점에서 의문이 들었습니다. 이 경우 문자열 리터럴의 메모리 주소가 밀려나거나, 다른 문자열을 침범하거나 하는 문제가 발생할 수 있지 않을까요? 예를 들어 원래 캐릭터 A가 "Hello"라고 출력 후, B 캐릭터가 "Oh, Hi!" 라고 해야 할 때 static 영역에 있는 메모리가 가지는 값은 다음과 같을거라 생각합니다.H e l l o \0 O h , H i ! \ 0 이 부분을 강제로 에디터로 고쳐서 안 녕 하 세 요 \0 응 , 안 녕 ! \ 0 라고 변경했다고 가정하겠습니다. 원래 프로그램에서는 기존에는 5byte의 Hello를 출력할겁니다. 그러나 "안녕하세요"는 10byte이므로 "안녕" 까지만 출력이 될 수 있을거라 생각합니다.또는 A가 "안녕"까지 출력 후 계속 다음 메모리 주소를 찾아서 출력해 B가 "하세요" 라고 하는 문제가 있을 수도 있을 것 같습니다. 그러나 그럼에도 다국어 지원이 가능했다고 하는데, 그렇다면 이와 같은 바이트 차이 문제 등을 어떻게 해결했는지 궁금합니다. Null Character \0 을 만날때까지 출력하기 때문에 문제가 없었나 싶기도 하네요.
-
해결됨독하게 되새기는 C 프로그래밍
큐의 배열을 넘겨도 정상작동합니다
예제를 거의 똑같이 구현했는데 환영큐로 구현을 한게 아닌 배열형태의 큐로 사이즈를 100을 줬는데 100개를 넘게 입력해도 정상작동을 합니다 왜 이런건가요?
-
해결됨독하게 되새기는 C 프로그래밍
캐너리비트에 관하여 질문
메모리의 주소값이 int자료형이면 4씩 증가하면서 저장될것같은데 캐너리비트를 넣는다면 더 증가하게 될텐데 릴리즈에서는 적용이 안되면 릴리즈모드에서는 스택메모리주소값이 4씩 증가하게 되는건가요? 그럼 디버그모드에서는 1mb만큼의 스택 메모리를 정확히 사용한다고 가정했을때 캐너리비트가 더 차지하게 되므로 오류가 발생하는건가요?64비트에서는 자동변수를 메모리에 저장할때 메모리값이 점점 커지는데 32비트와는 반대인건가요?
-
해결됨독하게 되새기는 C 프로그래밍
상수화된 문자열에 질문있습니다
안녕하세요 강의를 잘 듣고있는 수강생입니다 강의에서 쓰신것처럼 Hello World같이 문자열을 변수에 저장하면 실행 바이너리 파일에 저장되있는데 모든 Hello World는 모두 같은 메모리값을 가지는건가요? 그럼 만약 Hello World에 !를 하나 붙일경우 새롭게 할당이 되나요?
-
해결됨독하게 되새기는 C 프로그래밍
함수 호출 매개변수 전달에 대한 질문 드립니다.
함수 호출 매개변수 전달에 대한 질문 드립니다.call by reference 와 call by address 의 차이는 참조형의 경우에 실제 int a; 메모리 주소: 0x01int& ra=a; 메모리 주소:0x01int* pa=&a; 메모리 주소:0x~~ (ra와 a는 같음 하지만 포인터는 주소를 담는 변수이기 때문에 저장공간을 주소값으로 가짐)제가 이해한 것은 저 a 를 참조형과 포인터형으로 함수를 호출 했을 때실제 함수에 포인터로 받은 매개변수는 지역변수 선언하여 해당 포인터에 주소값이 들어있고,참조형으로 받은 함수에서는 매개변수가 따로 생성되지 않고, 호출자에 있던 a값의 주소와 피호출자의 int& a 의 주소값이 일치했습니다. 결과적으로 참조형은 스택공간에 변수를 따로 생성하지 않고, 호출자의 스택공간의 주소를 공유한다고 생각이 들어서 이 부분에서 차이가 있다고 생각이 들어서 제가 이해한것이 맞는지 궁금하여 질문 드렸습니다. 감사합니다.
-
해결됨독하게 되새기는 C 프로그래밍
단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.
b = 3 + a++ 의 연산식을 설명하실 때, ++ 연산에 있어서 전위식과 후위식 표기 설명 중에 질문이 있습니다.일단 전위식의 경우에는 push 할 때 ++ 연산이 실행되고, 후위식의 경우에는 pop 할때 연산이 실행된다고 강의 중에 설명하셨습니다. 예를 들어 a 의 값이 2라고 가정하고 후위식으로 진행하는 과정에 대해서 생각해보았습니다. 그렇다면 push하는 과정에서는 2값이 들어갈테고 pop 하는 과정에서 a 값이 3으로 증가하긴 할텐데, 해당 내용을 토대로 결과를 확인하면 b의 값은 5가 출력됩니다.그 말은 pop을 할 때 ++ 연산이 진행됐지만 연산은 2로 진행됐다는 뜻인거고 그 이후에 ++ 연산이 일어나고 3으로 진행된 것으로 사료됩니다.일단 대충 이해는 하려면 할 수는 있겠으나 디스어셈블 창을 보면서 순서상으로 어느 부분에서 ++ 연산이 이뤄졌는지 이해가 되지 않아 질문드립니다.
-
해결됨독하게 되새기는 C 프로그래밍
함수호출 규약 종류에 따른 장단점 여부
선생님, 강의 잘 듣고 있습니다.함수호출규약 강의에서 __cdecl 및 __stdcall에 대한 비교를 해주셨는데, 2가지 키워드에 대한 활용방안 및 장단점이 존재할까요?
-
해결됨독하게 되새기는 C 프로그래밍
정적라이브러리 링크 오류
안녕하세요 강사님, 정적 라이브러리 생성을 위해 속성->일반->구성형식을 정적 라이브러리로 설정하였는데도 LNK2001, LNK112C 에러가 발생합니다.
-
해결됨독하게 되새기는 C 프로그래밍
const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의
문자(배)열 상수는 어디에 저장되는가? 강의에서 문의 드립니다. (06:45)선생님 강의를 들으면서 따라치면 C2440 오류가 발생하며 다음과 같은 오류가 발생합니다.hello world는 const char* 이나 char* 자료형에 초기화하여 문제가 발생하는 것으로 이해하는데, 강의에서는 자연스럽게 디버깅이 되는 것 같더라구요 (저는 디버그로 돌리니 컴파일 에러가 발생합니다.) 혹시 디버깅을 하기 위해 추가적으로 진행되어야 하는 사항이 있을까요 ?.?
-
해결됨독하게 되새기는 C 프로그래밍
pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.
섹션1 문자(배)열 상수는 어디에 저장되는가?에서 4분쯤에 나오는char* pszParam = "Hello World\n";printf(pszParam); printf("Hello World\n"); 여기서 pszParam을 디버거 메모리에서 수정시 아래 hello world가 왜 수정되는지 잘 이해가 되지 않습니다. 기본적으로 다른 메모리 공간에 저장 되어야 될꺼라고 생각되는데 컴파일러가 알아서 최적화 했다고 봐도 될까요? printf("Hello World\n"); 여기를 글자 한개만 더 넣어도 pszParam을 수정해도 아래 print 되는 문자열이 같이 수정되지는 않았습니다. 그리고 질문하면서 궁금해진 점이 printf("Hello World\n");이것만 있을 때 이 hello world! 가 쓰여진 주소를 알 수 있는 방법이 있을 까요?
-
해결됨독하게 되새기는 C 프로그래밍
비선형 자료구조
혹시 비선형 자료구조 강의를 만드실 생각이 있으신가요? 있으면 듣고 싶네요 ㅎㅎ
-
해결됨독하게 되새기는 C 프로그래밍
자료 구조 공부 후에
독하게 되 세기는 C를 들어야 하나요? 아니면 자료구조 공부 전에 독하게 되 세기는 c를 들어야 하나요? 어떤 걸 먼저 들어야 더 깊이 있게 이해가 되나요? 아니면 상관 없나요?
-
해결됨독하게 되새기는 C 프로그래밍
강의자료 관련
강사님 강의자료 인쇄용으로 부탁드립니다!
-
해결됨독하게 되새기는 C 프로그래밍
마지막에 말씀하신 부분 질문드립니다.
매개변수가 레지스터보다 많아지면... 부분에서 혹시 자바도 C처럼 매개변수 처리에 레지스터를 쓰는지가 궁금한데 답변해주실 수 있다면 답변부탁드립니다!
-
해결됨독하게 되새기는 C 프로그래밍
문자열 관련 질문 드립니다
우선 예제 코드를 먼저 보여드리겠습니다. char arr[13] = "Hello World\n";char* arrr = "Hello World\n"; printf("%p\n", &("Hello World\n"));printf("%p\n", arrr);printf("%p\n", arr); "Hello World\n" 과 arrr이라는 포인터 변수의 대상이 완전히 일치한다는 것은 이해했습니다.그래서 4행과 5행의 출력 결과는 같다는 것을 실습으로 확인했습니다.그런데 6행의 출력 결과는 앞의 두 경우와 다르게 나왔습니다. 질문은 총 4가지입니다. 포인터 변수를 통해 직접 메모리 주소를 가져오는 것과배열을 통해 지역변수를 선언하여 문자 배열의 정보를 담는 것은 전혀 다른 것인가요?그렇다면 1행의 정보는 stack 영역에 저장되는 것인가요?배열도 상수화된 포인터이기에 1행과 2행이 같은 메모리 주소를 가리켜야 되는 것이 아닌가요?2행에서 선언된 포인터 변수의 경우 배열 연산자로 접근하여 쓰기를 시도할 경우 엑세스 위반의 예외를 알려주는데 읽고 쓰는 권한 때문에 다른 메모리 주소를 가리키게 되는 것인가요?
-
해결됨독하게 되새기는 C 프로그래밍
라이브러리
정적 라이브러리 보다는 동적 라이브러리의 장점이 많은 것 같은데, 정적 라이브러리도 많이 사용되나요?정적 라이브러리가 가지는 장점은 무엇이 있는지 궁금합니다.
-
해결됨독하게 되새기는 C 프로그래밍
부동소수점
float 형을 예로 들면,표현 범위가 1.17*10^(-38) 부터라고 되어있는데, 유효 숫자는 소수점 이하 6자리인 이유는 무엇인가요?
-
해결됨독하게 되새기는 C 프로그래밍
왜 변수 주소 사이에 offset이 있는 건가요?
매개변수를 아래 처럼 선언하고void Add (int a, int b, int c)메모리 창에서 보면 중간에 빈 곳 없이 3개가 연속으로 채워져 있는데 32비트 환경에서 지역 변수로 int a = 1, b = 2; 이렇게 선언을 하면 중간에 cc cc 이런 값들이 채워져 있고 12바이트 만큼 서로 떨어져 있는데요 왜 이런 현상이 발생하는 건가요?중간에 cc로 채워진 부분은 딱히 사용하는 것 같지는 않은데 낭비가 되지는 않나요?
-
해결됨독하게 되새기는 C 프로그래밍
stack 쌓는 순서
안녕하세요. 우분투 disas main으로 어셈블리어로 stack 이 어떻게 쌓는지 공부하는 중인데요.어셈블리어로 연산코드가 mov라서 제 해석이 틀린건가요? 지역변수는 선언한 순서로 Push된다고 이해했는데 실제로 해보니 달라서 질문드립니다. int type으로 정의한 $0x1, -0x30에서 주소가 -0x3a로 멀어져서 이해가 안돼서 질문 드렸습니다. 그 이후 부터는 stack이 하나씩 지워지면서 rbp 포인터로 가까워 지는 모양으로 이해했는데 char 형태에서 오히려 더 밀려나서 주소가 왜 밀린건지 이해가 되지않습니다. 물론 함수 호출이 아닌 변수를 정의한 거지만 결은 비슷할 거라 생각이 들어서 질문 드립니다. 너무 궁금해서 엉뚱한 질문이지만 알려주시면 감사합니다...
-
해결됨독하게 되새기는 C 프로그래밍
함수호출이랑 쓰레드
안녕하세요. 배운 내용을 한번 확인 및 함수호출과 쓰레드의 관계에 대해서 질문 드립니다! main함수에서 다른 함수를 호출할 때는 쓰레드가 생성되는게 아니고 하나의 main 쓰레드가 끝날때까지 진행 되는건가요?그리고 그 실행된 메인 쓰레드는 호출 된 함수로 이동하여 계산 또는 값을 수정 등을 하고 다시 반환하여 메인 함수로 가는 건가요? 만약 동시에(싱글코어로 가정하면) 이러한 실행을 하기 위해서는 쓰레드를 추가하는 것이라고 이해하면 될까요? 싱글코어로 가정한 쓰레드들은 OS가 동기화를 통해 쓰레드들간에 진행을 통제 하는건가요?