argv 포인터를 글로벌하게 사용해도 안전합니까?
사용해도 안전한가요?argv전세계 포인터?아니면 무효가 될 수 있는 사정이 있습니까?
즉, 이 코드는 안전합니까?
char **largs;
void function_1()
{
printf("Argument 1: %s\r\n",largs[1]);
}
int main(int argc,char **argv)
{
largs = argv;
function_1();
return 1;
}
네, 안전하게 사용할 수 있습니다.argv전세계적으로; 당신은 당신이 사용하는 것처럼 그것을 사용할 수 있습니다.char**당신의 프로그램에서.C99 표준은 다음과 같이 규정하고 있습니다.
매개변수들은
argc그리고.argv그리고 그들이 가리키는 끈들은argv배열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 최종 stored 값을 유지해야 합니다.
C++ 표준에는 유사한 단락이 없지만, 반대되는 규칙이 없는 암묵적인 단락도 있습니다.
C++와 C는 서로 다른 언어이므로 질문할 언어를 선택해야 합니다.
그것은 안전할 것입니다.main()함수가 종료되지 않습니다.다음에 일어날 수 있는 일들의 몇 가지 예.main()출구는 다음과 같습니다.
- 전역 변수와 정적 변수의 소멸자
- 실행 중인 스레드 수가 다음보다 길음
main()
저장된argv사용해서는 안 됩니다.
그 언급은 논쟁의 수명이 다음과 같이 될 것이라고 추측할 이유를 제공하는 어떤 것도 말하지 않습니다.main()함수는 함수 인수의 수명에 대한 일반 규칙과 다릅니다.
하기만 하면 됩니다.argv포인터 자체는 유효하며, C/C++ 런타임은 이 포인터가 가리키는 컨텐츠가 유효한지(물론 메모리를 손상시키지 않는 한) 보장해야 합니다.따라서 포인터와 컨텐츠를 그렇게 길게 사용하는 것이 안전할 것입니다.끝나고main()를 반환합니다. C/C++ 런타임에서도 콘텐츠를 유효하게 유지할 이유가 없습니다.따라서 위의 추론은 포인터와 포인터가 가리키는 내용 모두에 적용됩니다.
argv 포인터를 전역적으로 사용해도 안전한가요?
이를 위해서는 좀 더 명확한 설명이 필요합니다.처럼C11스펙은 §5.1.2.2.1 장에서 프로그램 시작을 말합니다.
[......]... 두 개의 매개 변수(여기까지 referred:
argc그리고.argv, 어떤 이름이라도 사용할 수 있지만, 이 이름들은 선언된 함수에 로컬이기 때문입니다.)
즉, 변수 자체의 범위는 다음과 같습니다.main(). 그들은 그 자체로 글로벌하지 않습니다.
역시 표준은 이렇게 말합니다.
매개변수들은
argc그리고.argvargv 배열에 의해 지시된 문자열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막 stored 값을 유지해야 합니다.
즉, 이 변수들의 수명은main()실행을 마칩니다.
따라서 전역 변수를 사용하여 다음 값을 유지하는 경우main(), 다른 함수에서 동일한 글로벌에 안전하게 액세스할 수 있습니다.
comp.lang.c.moderated newsgroup에 있는 이 스레드는 (주소를 취한 경우 argv 포인터 자체가 아닌) argv 배열의 내용을 보여주는 인용문을 포함하여 C 표준 관점에서 이 문제를 자세히 설명합니다.&argv(프로그램 종료)까지 지속되며, atexit-registered functions가 실행되는 동안 프로그램 종료가 아직 이와 관련된 방식으로 발생하지 않은 것은 "obvious"라는 주장이 저장되어 있습니다.
출구 등록 기능 처리 중 프로그램이 종료되지 않았습니다.우리는 그것이 꽤 명백하다고 생각했습니다.
(나는 더글라스 A가 누군지 확실하지 않습니다.그윈은 그렇지만, "우리"가 C 표준 위원회를 의미하는 것처럼 들립니까?)
토론의 맥락은 주로 포인터의 복사본을 저장하는 것이었습니다.argv[0](프로그램 이름).
관련된 C 표준 텍스트는 5.1.2.2.1입니다.
매개 변수 argc 및 argv와 argv 배열이 가리키는 문자열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막으로 저장된 값을 유지해야 합니다.
물론 C++는 C가 아니며, C++는 이 문제에 대해 기준이 미묘하게 다를 수도 있고, 이 문제를 해결하지 못할 수도 있습니다.
매개 변수로 전달하거나 다음 값에 저장할 수 있습니다.global variables. 당신이 돌아오지 않는 한main그리고 그것들을 처리하려고 노력합니다.atexit전역 범위에서 핸들러 또는 변수의 파괴자는 여전히 존재하며 어떤 범위에서든 액세스할 수 있습니다.
네, 메인이 끝난 후에 스레드가 없기 때문에 에테르 C 또는 C++에 안전합니다.
언급URL : https://stackoverflow.com/questions/31605132/is-it-safe-to-use-the-argv-pointer-globally
'bestsource' 카테고리의 다른 글
| MySQL 워크벤치와 MAMP PRO를 연결하는 방법은? (0) | 2023.11.05 |
|---|---|
| mariadb REGEXP_INSTR은 괄호를 사용할 때 0 또는 1을 반환합니다. (0) | 2023.11.05 |
| Woocommerce 3 전용 주문 제작 후크 (0) | 2023.10.31 |
| 웹 브라우저 제어 기능이 있는 Excel 사용자 지정 작업 창 - 키보드/초점 문제 (0) | 2023.10.31 |
| 그래픽 드라이버 "헬로 월드" 예시? (0) | 2023.10.31 |