char***
은 "char 포인터에 대한 포인터 포인터"입니다. 배열이 전혀 필요 없습니다. argv
은 "char에 대한 2 포인터의 배열"입니다. 배열의 이름 argv
은 특정 상황에서 첫 번째 요소에 대한 포인터로 부패합니다.이 포인터의 형식은 char**
또는 "char 포인터의 포인터"입니다.
&argv
을 수행하면 char* (*)[2]
또는 "2의 포인터 배열에 대한 포인터"가 나타납니다. 네가 원하는게 아니야. 왜냐하면 포인터가 아닌 배열의 주소를 사용하기 때문입니다.
또한 argv
의 포인터가 NULL 종료 문자열이 아닌 char
을 가리키고 있다는 사실에 문제가있을 것입니다. gtk_init
은 거의 확실히 null로 끝나는 문자열을 기대할 것입니다.
그럼 어떻게 할 수 있습니까? 우리가 const가 아닌가되도록 char
의 필요하기 때문에
char xx1[] = "1"; // Now these are null-terminated strings
char xx2[] = "2";
char* argv[] = {xx1, xx2};
char** argvp = argv; // Use the fact that the array will decay
gtk_init(&argc, &argv); // &argv will now be a char***
문자열에 대한 배열을 사용하는 이유는,하지만 char* str = "hello";
스타일 선언은 사용되지 않습니다 - 그것은 const char*
을해야합니다 :이보십시오. 그러나 배열을 사용하면 문자열 리터럴의 내용이 배열에 복사되므로 자유롭게이를 const
으로 만들 수 있습니다.
gtk_init
정말 그냥 그렇게처럼 당신의 주요 기능의 argc
및 argv
매개 변수를 전달하는 기대? &argv
이제 허용되는 이유
int main(int argc, char* argv[])
{
gtk_init(&argc, &argv);
// ...
}
이제 물어 "하지만 수 argv
가 동일한 유형으로하다 다시 말해 배열에 대한 포인터를 얻지 않는 이유는 무엇입니까? " 실제로, argv
은 그 모양이 얼마인지에 관계없이 같은 유형이 아닙니다. 배열 인수를 취하는 함수를 정의하면 실제로 포인터로 변환됩니다. 그래서 main
의 정의와 동일하기 :
int main(int argc, char** argv);
그래서 우리는 &argv
을 할 때 우리에게 char***
을 제공하기 때문에, 우리는 완전히 괜찮아요.
@OmnipotentEntity가 의견에서 말한 것처럼 main
의 매개 변수를 gtk_init
으로 전달하지 않는 것이 좋을 것입니다.
닫기. 'char * arr []'은 배열을 가리키는 포인터가 아니라 배열을 가리키는 포인터입니다. –
각'*'를'to pointer '로 대체하십시오. 가장 왼쪽에있는 유형을 추가하십시오. –
*** argv는 포인터에 대한 포인터입니다. 포인터에있는 내용에 따라 3 차원 배열의 동의어가 될 수 있습니다. – RonaldBarzell