2017-10-23 1 views
-3
strcat(argv[1], ".txt"); 
puts(argv[1]); 
strcat(argv[2], ".txt"); 
puts(argv[2]); 
puts(argv[1]); 

첫 번째 인수 ("1")는 "a"이고 두 번째 인수는 [2] "b"라고합니다. 이 코드는 다음과 같은 출력을 제공합니다 a.txt txt.txt a.txt.txt왜 배열의 "strcat"가 덮어 쓰기를 유발합니까?

왜 이런 일이가? strcat가 arg [2]를 덮어 쓰기 시작한 것처럼 보입니다.

+0

C에서 "문자열 관리"가 다릅니다. – alk

답변

2

argv[i]이 가리키는 문자열을 저장하는 데 할당되는 메모리의 양에 대해 가정하지 말아야합니다. 특히,이 문자열을 strcat 개까지 확장 할 수 있다고 가정 할 수는 없습니다. 그렇게하면 일반적으로 정의되지 않은 동작이 발생합니다. 이것은 실험에서 관찰 한 것과 정확히 같습니다.

길이가 변경되지 않고 argv[i]이 가리키는 문자열을 수정할 수는 있지만 일반적으로 해당 문자열을 "확장"할 수는 없습니다. 이러한 문자열이 메모리에서 바로 따라 올 수 있다고 생각할 수 있습니다. 즉, argv[1]이 가리키는 문자열의 끝을 지나면 무엇이든 쓰면 argv[2]이 가리키는 문자열을 덮어 쓰게됩니다.

+0

그렇다면 .txt 결말을 어떻게 추가할까요? – Hedhed

+0

@Hedhed 다른 문자열 만들기. (malloc) –

+0

@Hedhed로 충분한 바이트 할당 : 완전히 독립적 인 문자열을 만드는 대신'argv [1]'이 가리키는 메모리 위치에 저장된 문자열에 직접'.txt'를 추가하는 의도 된 효과는 무엇입니까? – AnT

관련 문제