2016-07-05 9 views
1

"NS2 Simulator"를 사용하여 컴퓨터 네트워크를 시뮬레이션하고 있습니다. char * 대신 const char* const* argv을 사용해야하는 이유를 정말로 이해하지 못합니까?"char *"대신 "const char * const * argv"를 사용하는 이유는 무엇입니까?

대신 char *을 사용할 수 있습니까? 이 주제에 대한 많은 품질 관리가 있지만 그것에 대해 혼란스러워했습니다. 이 질문에 "중복"이라고 표시하지 마십시오. 아래 기능에서 const char* const* argv을 사용하는 이유는 무엇입니까? 이것이 C++ 표준의 규칙입니까? 그 대신 string 또는 char **을 사용할 수 있습니까?

Function Connector::command. 
    //~ns/common/connector.cc 
    int Connector::command(int argc, const char*const* argv) 
    { 
    Tcl& tcl = Tcl::instance(); 
    ... 
    if (argc == 3) { 
    if (strcmp(argv[1], "target") == 0) { 
    ... 
    target_ = (NsObject*)TclObject::lookup(argv[2]); 
    ... 
    } 
    ... 
    } 
    return (NsObject::command(argc, argv)); 
    } 
+1

'argv'가'main'에 대한 전형적인 인자라고 가정하면,'char **'가 아니라'const char * const *'가 아닌'char **'이어야합니다. – Cornstalks

+0

그리고 만약 당신이 "const char * const * argv"의 "괴물"이 무엇을 의미하는지 알고 싶다면 [this] (http://c-faq.com/decl/spiral.anderson.html) . 위에서 언급했듯이, 표준 C는'main'의 두 번째 인수가'char **'유형이어야한다고 명령합니다. – vsoftco

+0

@Cornstalks 또는'char * argv []'는 OP의 이익을 위해 이것을 게시하는 것만으로도 작동 할 것입니다. –

답변

0

왜 우리는 대신 "의 char *"의 "CONST이 ... argv를"사용해야합니까?

'const'는 컴파일러가 작성한 코드가 argv를 수정하려고 할 때 컴파일러에게 알려주는 프로그램입니다.

대신 char *를 사용할 수 있습니까?

아마도 가끔은 중요하지 않습니다. 그러나 실수로 argv (또는 const var 이름이 무엇이든간에)를 수정하면 컴파일러는 실수로 실수를하게하지 않으며 결과는 UB조차도 원하지 않는 결과 일 수 있습니다.

+0

UB가 될 수있는 시나리오를 공유 할 수 있습니까? – CinCout

0

프로그래머는 const가 허용되는 인수를 인수로 허용합니다. 이 서명의 장점은 :

void func(const char* const* argv); 

... 그것은 어떤 CONST 자격으로, (main() 또는 exec()에 전달 된 유형의) 인수의 배열을 수락하는 것입니다.

그래서 모든 허용됩니다 :

int main(int, char** argv) 
{ 
    func(argv); 
} 

int main(int, const char** argv) 
{ 
    func(argv); 
} 

int main(int, char* const* argv) 
{ 
    func(argv); 
} 

int main(int, const char* const* argv) 
{ 
    func(argv); 
} 

그래서 당신이 선택하는 다음 (함수가 수정되지 않습니다) 인수 배열에게 그것의 아마 최고의 서명을 매개 변수를 허용하는 함수를 작성하는 경우.

2

const char*const* argv"상수 문자에 대한 상수 포인터의 포인터"을 의미합니다. char *과 같지 않습니다. argv 포인터가 재 할당되지 않기 때문에 const 수정 자에 대한 이유가 있습니다. 요소는 첨자로 액세스해야합니다.

이렇게하면 호출자가 argv를 동적으로 할당하고 command()에 전달한 다음 나중에 해제 할 수 있습니다. 그렇지 않으면 포인터가 해제되기 전에 포인터를 다른 곳으로 향하면 가리키는 데 사용한 메모리가 유출 된 것입니다.

const char* const* argv은 두 가지 수준의 간접 참조를 만듭니다. 첫 번째 수준은 const pointer to a const char이고 두 번째 수준은 const 포인터에 대한 포인터입니다.