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
그리고.argv
argv 배열에 의해 지시된 문자열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막 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 |