해결된 질문
작성
·
183
0
안녕하세요 강사님
[섹션10 연산자] 필수 실습 문제 합격, 불합격 판단하기 문제 질문드립니다.
강사님께서는 printf 함수안에 조건(3항)연산자를 넣으셨는데요
저는 nSelect이라는 문자열을 선언해서 nSelect에 합격, 불합격이라는 문자열을 저장해서 printf로 출력하는 방식으로 문제를 풀어봤습니다
nSelect이라는 변수에 문자열의 공간!?을 10byte로 선언하고 0으로 초기화 한뒤에 실행을 했더니 실행은 잘 되는데 nSelect이라는 변수에 빨간색 밑줄과 오류 코드가 L-value로 뜨더라구요
왼쪽 피연산자를 변수인 nSelect으로 선언했는데 오류코드가 왜 뜨는건지 모르겠고 오류코드가 뜨는 왜 점수를 80으로 입력하면 '합격', 70으로 입력하면 '불합격'이라고 실행이 잘되는데 왜 그런지 이유가 궁금합니다. 문제가 없는건가요?
일부러 오류를 내보려고 nSelect이라는 변수에 문자열의 공간!?을 1byte로 선언하고 0으로 초기화 한뒤에 실행을 했더니 일단 실행은 잘됩니다. "합격"이라는 글자는 한글이므로 한글자 당 2byte 총 4byte의 크기이고 "불합격"이라는 글자는 3*2 = 6byte라서 nSelect라고 선언한 문자열 변수에 공간에 없어서 실행조차 되지 않아야하는데 실행이 됩니다. 왜 실행이 되는 것일까요? 물론 하단 오류 목록에 '배열의 크기가 0보다 커야합니다.' '상수크기의 0 배열을 할당할 수 없습니다'라는 설명이 있긴하지만 실행은 되어서 의문입니다. 또한 8번째 코드의 L-vaule 오류는 여전히 나옵니다.
nSelect 문자열의 크기 선언을 1byte로 하면 역시 실행은 잘되는데 여전히 L-value 오류 항목이 뜹니다 선언한 배열의 크기가 1byte인데 그보다 크기가 큰 "합격", "불합격"이 문자열에 대입되고 실행이 됩니다.
이유가 궁금합니다
답변 1
0
10바이트로 선언한 것이 아니라 char[10] 배열로 선언한 것입니다. 배열의 이름은 주소에 부여한 것이며 l-value가 아니라 r-value 입니다. "합격", "불합격" 같은 문자열을 담고 싶다면 단순 대입을 할 것이 아니라 strcpy_s(), 혹은 memcpy() 같은 함수를 이용해 메모를 복사해야 합니다.
1번과 같은 이유의 문제입니다. 그리고 실행이 잘 됐다고 했는데 착각하신 것 같습니다. 배열 선언 시 요소값을 0으로 기술하면 컴파일 오류가 발생하기 때문입니다. 애초에 빌드결과를 얻을 수 없습니다. 배열에 대해 다시 공부하는 것이 좋겠습니다.
2번과 같습니다. 컴파일 오류가 확실한 상황입니다. 아마도 전에 마지막으로 성공한 빌드를 실행한 것으로 보입니다. 참고하시기 바랍니다. 😄