Stack around the variable '변수명' was corrupted 오류 질문 좀 부탁드립니다. ㅠㅠ
조회수 478회
define _CRT_SECURE_NO_WARNINGS
include
include
include
char* my_strcap(char* str1, char* str2) { char* result = (char*)malloc(sizeof(char) * 40);
int i, j;
if (result != NULL)
{
//배열 형태로 문자열이 저장되어 있으니 각 배열 인덱스에 저장하는 방식
for (i = 0; i < *(str1 + i) != 0; i++)
{
*(result + i) = *(str1 + i);
}
//i+j인 이유는 첫번째 배열이 저장된 인덱스 다음 인덱스에 저장되어야 하기 때문
//처음 문자열이 4글자라고 하면 i는 0,1,2,3까지 돌고 4인 상태로 넘어옴
//즉 4번째 인덱스부터 넣어주게 될 것임
for (j = 0; i < *(str2 + j) != 0; j++)
{
*(result + i + j) = *(str2 + j);
}
//문자열의 끝을 지정하기 위해서.
//마찬가지로 두번째 문자열이 3글자이면 j는 3인 상태로 넘어옴
//즉 4+3 = 7인 인덱스에 넣어질 것임.
//abcd + efg (+ null)로 총7글자, 배열로 따지면 arr[7]임.
*(result + i + j) = NULL;
}
return result;
}
int main() { char input1[21], input2[21]; int input_1 = 0, input_2 = 0;
do
{
scanf("%s %s", input1, input2);
input_1 = strlen(input1);
input_2 = strlen(input2);
printf("%d, %d", input_1, input_2);
if (input_1 <= 20 && input_2 <= 20)
{
printf("%s", my_strcap(input1, input2));
}
else
{
printf("입력 오류로 종료함.\n\n");
}
} while (input_1 > 20 || input_2 > 20);
return 0;
}
//질문 들어가겠습니다..
해당 구문은 20자 이내의 문자열 2개를 받고, 두 문자열이 각각 20자 이내라면 이어주는 코드입니다.
한번에 두 문자열이 각각 20자 이내면 문제 없이 진행되나
한번이라도 두 문자열 중 한 문자열이라도 20자가 넘으면 다시 입력을 받는데 이 과정에서
제대로 입력이 되어도 마지막에 Stack around the variable '변수명' was corrupted. 라는 오류가 뜹니다.
이는 배열의 크기보다 더 큰? 입력이 들어가거나 할 때 발생한다고 하는데..아무리 생각해도 해결법을 모르겠습니다.
어떻게 하면 될까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
linux 기준으로 간단히 말씀드리면...
-------스택------- input_B input_A canary bit eip ------------------
인데 input_B 와 input_A 는 스택위치는 컴파일러에 따라 달라질거같네요 여튼... 특정 변수(위 경우 input_A) 의 길이가 넘어갈경우 canary bit 를 오염시켜서 프로그램내 메모리 오염(해킹)을 식별한거고요..
해결책은
#define _CRT_SECURE_NO_WARNINGS
이거 끄시고scanf_s
를 사용하셔서.. 입력받을 길이에 대해 검증하세요.. -
답변이라고 할 수 있는지모르겠지만 제의견을 적어둘께요. 저는 실행이 됐습니다! 하지만 코드는 20자이내라면 멈추고 20자이상이면 다시입력받는코드인것같아요.
abcdefghijklmnopqrstuvwxyz //첫번째입력 asdfdsasdf //두번째입력 26, 10입력 오류로 종료함. //오류가 났으므로 종료해야합니다 //printf("입력 오류로 종료함.\n\n");이라서 2번 줄바꿈되고, asdfdsaasdfdsadsfds //다시루프가 됩니다. adsfasdfa 19, 9asdfdsaasdfdsadsfdsadsfasdfa //제대로 입력했더니 종료됩니다.
입출력이 위와같이됐습니다.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> char* my_strcap(char* str1, char* str2) { char* result = (char*)malloc(sizeof(char) * 40); int i, j; if (result != NULL) { //배열 형태로 문자열이 저장되어 있으니 각 배열 인덱스에 저장하는 방식 for (i = 0; i < *(str1 + i) != 0; i++) { *(result + i) = *(str1 + i); } //i+j인 이유는 첫번째 배열이 저장된 인덱스 다음 인덱스에 저장되어야 하기 때문 //처음 문자열이 4글자라고 하면 i는 0,1,2,3까지 돌고 4인 상태로 넘어옴 //즉 4번째 인덱스부터 넣어주게 될 것임 for (j = 0; i < *(str2 + j) != 0; j++) { *(result + i + j) = *(str2 + j); } //문자열의 끝을 지정하기 위해서. //마찬가지로 두번째 문자열이 3글자이면 j는 3인 상태로 넘어옴 //즉 4+3 = 7인 인덱스에 넣어질 것임. //abcd + efg (+ null)로 총7글자, 배열로 따지면 arr[7]임. *(result + i + j) = NULL; } return result; } int main() { char input1[21], input2[21]; int input_1 = 0, input_2 = 0; do { scanf("%s %s", input1, input2); input_1 = strlen(input1); input_2 = strlen(input2); printf("%d, %d", input_1, input_2); if (input_1 <= 20 && input_2 <= 20) { printf("%s\n", my_strcap(input1, input2));//잘보이게 \n를 넣어봤습니다. } else { printf("입력 오류로 종료함.\n\n"); } } while (input_1 < 20 && input_2 < 20); //여기의 부호가 반대였습니다. (>) 와 (||) return 0; }
해결방법은 모르지만 저의경우 Stack around the variable '변수명' was corrupted.에러는 input1와 input2둘다 20이상일때 났습니다.
댓글 입력