구조체로 성적관리하는 간단한 프로그램을 만들어 보고 있는데,
포인터로 구조체에 접근해서 하다가 이상한 현상을 발견했어요.
구조체 배열을 student[40] 이라고 선언하고,
입력은 포인터를 이용해서 student[41]에 데이터들을 넣었더니 ..
이럴수가 구조체의 형태대로 출력이 되는거예요 ㅜㅜ
메모리 주소값을 찍어보니 student[39] 다음에 student[40], student[41] 이렇게 순차적으로 메모리값이 주어져있네요.
그래서 실험을 해본다고 아래와 같이 구조체대신 배열을 이용해서 간단한 예제를 짰는데,
배열의 크기는 10이지만 입력을 a[11]까지 넣어서 출력해보면
결국 출력이 된단 말이죠..
어떻게 이럴수가 있죠?
특히 구조체에서 char, int, float 형태대로 각각 저장되서 읽히는게 너무너무
신기하고 이상함 ㅜㅜ
미스터리 갤에 가지 않도록 제발 도와주세요 ㅜㅜ
#include <stdio.h>
int main()
{
int a[10];
int *pa = a;
int temp, num, count, i;
printf(\"몇명을 입력하시겠습니까? >>\");
scanf(\"%d\", &count);
for(i=0; i<count; i++) {
printf(\"번호를 입력하세요 >>\");
scanf(\"%d\", &num);
printf(\"입력할 수를 입력하세요 >>\");
scanf(\"%d\", &temp);
a[num-1] = temp;
printf(\"입력한 데이터들는 다음과 같다.\\n\");
printf(\"%d번에 %d를 입력\\n\", num, a[num-1]);
}
printf(\"%d\", a[11]);
}
-----------수정-----------------------------
더 극단적으로 예를 들자면
#include <stdio.h>
int main()
{
int a[10];
int temp;
printf(\"입력할 수를 입력하세요 >>\");
scanf(\"%d\", &temp);
a[12] = temp;
printf(\"입력한 데이터는 다음과 같다.\\n\");
printf(\"13번에 %d를 입력\\n\", a[12]);
}
이렇게 하면 오버플로우가 발생 안하고, 그냥 내가 입력한 값이 출력 된다는 거...
a는 크기가 10인데 어째서 12에 입력, 출력이 가능한거지??
아스트라로테// 오빠 나 절실해 ㅜㅜ 이것땜에 머리아푸 ㅜㅜㅜㅜ
못생겨서 죄송합니다
coding// 그래도 좀 어떻게 안될까요? 어휴ㅜㅜㅜ한숨이 폭풍이요, 눙물이 바다를 이룰 지경인데 ㅜㅜㅜㅜ
오버플로우~ 결과를 예상할 수 없긔~
데비안// 입력한대로 출력이 나오니까 미스터리.. ㅜㅜ
/*입력은 포인터를 이용해서 student[41]에 데이터들을 넣었더니 */
ㅇㅅㅇ// 구조체배열 크기를 40으로 했으니까, 0번부터 39번까지만 입력되야하고, 40번부터는 입력이 안되는게 정상인데, 왜 들어가는거죵? 그것도 구조체 배열의 형태대로 들어가는데 ㅜㅜ
그런가보다 해야지 뭐
윙?// 그런가보다 했다가 완전 깨졌음 ㅜㅜ 이유 설명 못하면 나 죽을지도 몰라 ㅜㅜ
길멍씨 버퍼 오버플로우를 검색해보셈;; 구조체에서 하면 안되는 실수중 하나임;
설명해줘?
원래 이거 요즘 컴파일러에서는 막혔다던데
나는 리눅스 쟁이라 비쥬얼 스튜디오 따위 모르긔 ㅋ
데비안// 버퍼 오버플로우 발생하면 출력 값이 이상해야 하는거 아닌가요?ㅜㅜ 어째 오버플로우 발생했는데도 정상 작동을 하는지가 궁금한데 ..
님 운이좋은거임. 인덱스 초과한곳들이 이미사용중인곳이엇음 에러뜨죠
다른 지역변수가 깨졌겠죠