나는 명령 줄 인수가 문자 배열이고 스택에 저장된다는 것을 알고있다. 하지만 각 인수에 대해 할당 된 실제 메모리를 알고 싶습니다. 예 : 명령 줄 인수로 디렉토리 이름 "/ tmp"를 전달했다고 가정합니다. 이것은 argv [1]에 저장됩니다. 그러나 테스트를 거쳐 프로그램에서 argv [1]을 "/ tmp/log /"(크기가 증가)로 변경할 수 있습니다. 이것이 어떻게 가능한지 ?argv []에 얼마나 많은 메모리가 할당 되었습니까?
답변
가 귀하의 질문에 대답하려면, 인수 문자열과 전달 된 환경에서 사용할 수있는 총 최대 크기를 얻을 수있다 자세한 내용은 http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html을 참조하십시오. (제 리눅스 박스에서는 제한이 2097152입니다).
당신의 예제는 인자와 환경이 사실적으로 연속적으로 저장되어 있기 때문에 발생합니다. 따라서 문자열에 추가하면 인수 나 환경 뒤에 나오는 내용을 덮어 씁니다. 그런 이유로 argv 문자열을 확장하고 확장하는 것은 나쁜 생각입니다. 그것들을 수정하고 싶다면 그것을 편집하거나 축소 시키십시오.하지만 그것을 확장하려고하면 문제가 생깁니다.
아주 잘 대답합니다.또한 argv [0] [0]의 주소를 시작한 후 100자를 인쇄하려고했습니다. 인수와 환경은 실제로 연속적으로 저장됩니다. 고맙습니다. – techiek7
Linux의 경우 매개 변수는 create_elf_tables
으로 채워집니다. 적어도이 특정 플랫폼의 경우 값이 스택에 저장되어있는 것이 맞습니다.
리눅스는 인수와 (초기) 환경 변수를 스택에 저장하는 데 필요한만큼의 메모리 만 사용합니다. 이미있는 것 이상을 사용하려고하면 다른 것을 덮어 쓰는 것입니다 (또는 충돌).
표준은 argv가 특수 내부 변수이므로 수정할 수 있다고 명시하고 있습니다.
177 - 매개 변수 argc와 argv와 argv 배열이 가리키는 문자열은 프로그램에 의해 수정 가능해야하며 프로그램 시작과 프로그램 종료 사이에 마지막으로 저장된 값을 유지해야하므로 필요한만큼만 할당됩니다 양도 또는 교체.
표준 텍스트 :
getconf ARG_MAX
명령 줄에서
또는 syconf 동등한 : http://c0x.coding-guidelines.com/5.1.2.2.1.html
_proposed_ C 표준을 참조했습니다. – chux
- 1. Malloc -> 얼마나 많은 메모리가 할당 되었습니까?
- 2. EXC_BAD_ACCESS : 너무 많은 메모리가 할당 되었습니까?
- 3. 이 경우 얼마나 많은 메모리가 필요합니까?
- 4. 얼마나 많은 메모리가 유출되었는지 추적하는 방법은 무엇입니까?
- 5. 얼마나 많은 비트가 사용 되었습니까?
- 6. 얼마나 많은 결과가 반환 되었습니까?
- 7. 얼마나 많은 총알이 발사 되었습니까?
- 8. 무례하게되기 전에 얼마나 많은 메모리가 필요합니까?
- 9. 얼마나 많은 메모리를 할당 할 수 있습니까?
- 10. Marshal.AllocHGlobal으로 할당 된 메모리가 손상 되었습니까?
- 11. 주소를 나타내는 데 얼마나 많은 메모리가 필요합니까?
- 12. 얼마나 많은 메모리가 세션 변수에 할당됩니까?
- 13. 메모리가 고정 (고정) 되었습니까?
- 14. 대략적인 수치를 얻을 수있는 방법, 프로그램에서 얼마나 많은 메모리가 누출 되었습니까?
- 15. Netty 직접 버퍼 메모리가 어떻게 할당 및 할당 해제 되었습니까?
- 16. MongoDB에서 얼마나 많은 문서가 제거 되었습니까?
- 17. 얼마나 많은 파이썬 명령어가 해석 되었습니까?
- 18. SSL 연결에서 얼마나 많은 데이터가 유출 되었습니까?
- 19. 얼마나 많은 바이트가 지금까지 업로드 되었습니까? 아래
- 20. 특정 싱크에서 얼마나 많은 데이터가 전송 되었습니까?
- 21. 1 초에 얼마나 많은 레코드가 삽입 되었습니까?
- 22. 개체의 기능 및 속성에 별도의 메모리가 할당 되었습니까?
- 23. 얼마나 많은 메모리를 할당 할 수 있습니까?
- 24. 메모리 할당 및 ** argv 인수
- 25. ZUUIRevealController 메모리가 누출 되었습니까?
- 26. 오브젝트를 SuperView에서 제거하지만 메모리가 여전히 할당 되었습니까? (ARC)
- 27. 메인 클래스에 할당 된 메모리가 서블릿에서 실행 되었습니까?
- 28. Object 배열을 초기화 할 때 Java에서 얼마나 많은 메모리가 할당됩니까?
- 29. presta shop - 제품 페이지에 얼마나 많은 메모리가 사용되었는지 보여줍니다.
- 30. "빈"Chrome 확장 프로그램을 사용하려면 얼마나 많은 메모리가 필요합니까?
"나는 그 사실을 알지 못한다." –
"그러나 테스트를 거쳐 프로그램에서 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 [] '만큼 정확하게 있다고 가정해야합니다. –
'argv [1] = "/ tmp/log")'라면 argv [1]'이 가리키는 문자열의 크기를 늘리지 않고있다. 'strcat (argv [1], "/ log")'가 성공적 일지는 모르겠습니다. – molbdnilo