2016-09-21 4 views
1

나는 명령 줄 인수가 문자 배열이고 스택에 저장된다는 것을 알고있다. 하지만 각 인수에 대해 할당 된 실제 메모리를 알고 싶습니다. 예 : 명령 줄 인수로 디렉토리 이름 "/ tmp"를 전달했다고 가정합니다. 이것은 argv [1]에 저장됩니다. 그러나 테스트를 거쳐 프로그램에서 argv [1]을 "/ tmp/log /"(크기가 증가)로 변경할 수 있습니다. 이것이 어떻게 가능한지 ?argv []에 얼마나 많은 메모리가 할당 되었습니까?

+5

"나는 그 사실을 알지 못한다." –

+0

"그러나 테스트를 거쳐 프로그램에서 argv [1]을"/ tmp/log/"(크기가 증가)로 변경할 수 있습니다." 네, C 표준은'argv' ([N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf), 섹션 5.1.2.2.1, 절 2, 마지막 제약), "크기를 늘리는 것"은 아마도 UB 일 것이다. 제로 종료 문자열과 같이 수정 가능한'char [] '만큼 정확하게 있다고 가정해야합니다. –

+2

'argv [1] = "/ tmp/log")'라면 argv [1]'이 가리키는 문자열의 크기를 늘리지 않고있다. 'strcat (argv [1], "/ log")'가 성공적 일지는 모르겠습니다. – molbdnilo

답변

1

가 귀하의 질문에 대답하려면, 인수 문자열과 전달 된 환경에서 사용할 수있는 총 최대 크기를 얻을 수있다 자세한 내용은 http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html을 참조하십시오. (제 리눅스 박스에서는 제한이 2097152입니다).

당신의 예제는 인자와 환경이 사실적으로 연속적으로 저장되어 있기 때문에 발생합니다. 따라서 문자열에 추가하면 인수 나 환경 뒤에 나오는 내용을 덮어 씁니다. 그런 이유로 argv 문자열을 확장하고 확장하는 것은 나쁜 생각입니다. 그것들을 수정하고 싶다면 그것을 편집하거나 축소 시키십시오.하지만 그것을 확장하려고하면 문제가 생깁니다.

+1

아주 잘 대답합니다.또한 argv [0] [0]의 주소를 시작한 후 100자를 인쇄하려고했습니다. 인수와 환경은 실제로 연속적으로 저장됩니다. 고맙습니다. – techiek7

1

Linux의 경우 매개 변수는 create_elf_tables으로 채워집니다. 적어도이 특정 플랫폼의 경우 값이 스택에 저장되어있는 것이 맞습니다.

리눅스는 인수와 (초기) 환경 변수를 스택에 저장하는 데 필요한만큼의 메모리 만 사용합니다. 이미있는 것 이상을 사용하려고하면 다른 것을 덮어 쓰는 것입니다 (또는 충돌).

0

표준은 argv가 특수 내부 변수이므로 수정할 수 있다고 명시하고 있습니다.

177 - 매개 변수 argc와 argv와 argv 배열이 가리키는 문자열은 프로그램에 의해 수정 가능해야하며 프로그램 시작과 프로그램 종료 사이에 마지막으로 저장된 값을 유지해야하므로 필요한만큼만 할당됩니다 양도 또는 교체.

표준 텍스트 :

getconf ARG_MAX 
명령 줄에서

또는 syconf 동등한 : http://c0x.coding-guidelines.com/5.1.2.2.1.html

+0

_proposed_ C 표준을 참조했습니다. – chux

관련 문제