메인 함수의 아규먼트에 문자열을 덮어써도 되나요?

글쓴이: 익명 사용자 / 작성시간: 목, 2011/08/18 - 12:20오전
메인 함수의 아규먼트에 문자열을 덮어써도 되나요?
예를 들어서,
int main(int argc,char *argv[]) { // argv[2]에 "1234"라는 문자열이 넘어옵니다. strcpy(argv[2], "1234567890"); // argv[2]에 "1234"보다 긴 문자열인 "1234567890"을 복사합니다 func(argc, argv, option);
위와 같이 넘어온 메인함수의 아규먼트 중 argv[2]에 이전에 넘어온 문자열보다 긴 다른 문자열을 복사한 후에 다른 함수에 다시 넘기는 방식입니다
이전에 넘어온 문자열보다 짧은 문자열을 덮어쓰면 문제가 될 것 같지 않은데
이전에 넘어온 문자열보다 긴 문자열을 덮어쓰면 혹시 문제가 생기지 않을지 궁금합니다
일단 테스트 결과는 잘 동작하는데,
메인 함수로 넘어오는 매개변수를 어느 영역에 저장하는지 모르겠고
그 영역에서 "1234" 이후의 메모리 영역을 침범해서 덮어쓰지 않을까 걱정됩니다
아니면 이 경우에 새로운 args[]를 선언해서
strcpy(ARGS[1], argv[1]);
strcpy(ARGS[2], "1234567890");
strcpy(ARGS[3], argv[3]);
argv를 전부 복사한 후에
func(argc, ARGS, option);
이렇게 넘기는 편이 나을까요?
답변주시면 정말 감사하겠습니다
Forums:
main 함수 인자들은 환경 변수와 함께 스택
main 함수 인자들은 환경 변수와 함께 스택 아래(스택이 거꾸로 자라니까 주소 기준으로 하면 스택 위)에 저장됩니다.
예로 드신 코드는 경우에 따라 별 문제 없이 동작할 수도 있지만 기본적으로 위험한 코드입니다. 말씀 대로 긴 문자열을 저장하기 위한 메모리를 동적으로 할당해서 문자열을 복사하는 게 맞습니다. func 함수 말고는 argv를 사용하지 않는다고 하면 이런 식도 가능합니다.
$PWD `date`
답변 정말 감사합니다
답변 정말 감사합니다
올려주신 코드는 전혀 문제의 여지가 없는 것인가요?
댓글 달기