bestsource

argv 포인터를 글로벌하게 사용해도 안전합니까?

bestsource 2023. 11. 5. 14:49
반응형

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()출구는 다음과 같습니다.

  1. 전역 변수와 정적 변수의 소멸자
  2. 실행 중인 스레드 수가 다음보다 길음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

반응형