1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main(void) { int first; int last; int totarray[10] = { 0, }; printf("Input range(first) : "); scanf("%d", &first); printf("Input range(second) : "); scanf("%d", &last); for (int i = first; i <= last; i++) { //숫자를 문자열로 저장할 배열 char tmparr[4] = { -1, }; //숫자를 하나하나 배열(문자열)에 저장. sprintf 함수는 남은 버퍼(배열)에는 NULL(0x00)을 저장함 //이상하게 여기서 bof? 가 일어남. totarray[0]이 강제로 0이 됨. sprintf(tmparr, "%d", i); for (int j = 0; j < 4; j++) { int intstring = tmparr[j] - 0x30; if (intstring != -48) { totarray[intstring]++; } } } for (int i = 1; i < 10; i++) { printf("%d: %d \n", i, totarray[i]); } return 0; } | cs |
짠 소스코드는 최대 4자리수 입력받아와서 각 자릿수 숫자들 더해서 배열에 출력하는건데
그냥 sprintf로 배열에 저장해서 그 배열 접근해서 출력하게 간단하게 짰음 ㅇㅇ;;
보기만 하면 간단하게 잘 작동될거같은데
26번째 sprintf 함수가 실행되고나면 짤처럼 intstring[0] 가 무조건 0으로 초기화되버림
그래서 일단 해결은 배열크기 11로해서 1번째 인덱스부터 이용해서 해결하긴했는데
이게 sprintf가 bof일어나서 intstring 배열까지 접근해버려서 조작해버리는거임?
아님 내가 모르는 존나개쩌는기술때문에 sprintf의 출력값이 강제로 intstring 배열에 저장되버리는거임?
4자리면 문자4개 들어가고 마지막에 null들어가서 넘친것같네
변수선언방식 보니 메모리가 tmparr 바로위에 totarray가 있어서
그럼 저거 해결방법없음? 그 최대최적화 옵션 끄면되나
sprintf로 1000쓰면 tmparr에 문자1 0 0 0 넣고 숫자 0쓰는데 자리가 없어서 totarray 침범하는듯
아 그럼 tmparr 배열 크기를 5로 설정하면되겠네 ㄳ