2014-02-07 7 views
1

나의 C 스킬은 매우 녹슨 것이므로 바보 같은 질문이라면 사과하겠습니다.하지만이 간단한 질문에 대한 답을 찾아야한다고 생각조차 할 수 없습니다.char * argv []를 전달하고 char * argv를 선언하는 것과 다른 점은 무엇입니까?

#include <ruby.h> 

int run_script(int argc, char *argv[]) { 
    ruby_sysinit(&argc, &argv); 
} 

을하지만이 코드를 컴파일 할 때, 나는 다음과 같은 경고를 얻을 : 이 코드는 경고없이 컴파일 내가 두 경우 모두 같은 포인터 타입을 전달하고 같은

#include <ruby.h> 

int run_script(char * parameters) { 
    int argc=0; 
    char *argv[1]; 
    ruby_sysinit(&argc, &argv); 
} 

run_script_3.c: In function 'run_script': 
run_script_3.c:7: warning: passing argument 2 of 'ruby_sysinit' from incompatible pointer type 

보인다합니다.

+0

그냥 확인 : 두 경우 모두 동일한 컴파일 옵션 (경고 수준 등)? –

+0

예 동일한 정확한 명령 행 옵션, 다른 파일 내용 만 – nPn

+0

ruby_sysinit의 프로토 타입은 무엇입니까? –

답변

0

ruby_sysinit의 서명은 다음과 같습니다 (I 잘못된 루비 버전을 포착 경우, 정정 해줘 내 시스템의 헤더 파일이없는)입니다 :

void ruby_sysinit(int *argc, char ***argv); 

이 즉, 다음과 같은 컴파일 :

extern void ruby_sysinit(int *argc, char ***argv); 

int run_script(char * params) { 
    int argc = 0; 
    char **argv; 
    ruby_sysinit(&argc, &argv); 
} 

이제 char *argv[1]을 선언하면이 요소가 하나 인 배열임을 컴파일러에 알립니다. 이것은 char **argv과 같지 않습니다.

편집 : this question on SOthis article (as linked in the other question)이 유용 할 수 있습니다.

2

형식 매개 변수 선언의 배열은 포인터와 같습니다. 당신은 매개 변수로 배열을 보낼 수 없기 때문에

int run_script(int argc, char *argv[]) { ... } 

의 선언

int run_script(int argc, char **argv) { ... } 

에 해당합니다. 포인터 만 보낼 수 있고 실제 매개 변수로 배열을 넣더라도 항상 포인터로 변환됩니다. 그런 다음 &argv을 입력하면이 매개 변수의 주소를 가져 오므로 argv의 값이 저장된 시스템 스택의 주소입니다.

반면에 코드의 배열은 여전히 ​​배열이며 다른 유형입니다. 귀하의 경우 &argv은 첫 번째 버전 run_script 안에 char *** 유형이고 두 번째 버전은 char *(*)[1] 유형입니다. 같은 유형으로 보이지만 그렇지는 않습니다. 두 개의 호출이 두 개의 완전히 다른 값을 ruby_sysinit에 보내므로 실행 시간에는 더 큰 차이가 있습니다.

번째 예 : 배열에 도포 opearator & 어레이의 첫 번째 요소로의 포인터를 제공하기 때문에

int run_script(char * parameters) { 
    int argc=0; 
    char *argv[1]; 
    ruby_sysinit(&argc, &argv); 
} 

아마 세그먼트 폴트가 발생할 것이다. 따라서 전화 ruby_sysinit(&argc, &argv);ruby_sysinit(&argc, argv);과 동일한 값, 즉 에 의해 char*을 가리 키지 않고 char*을 가리키는 값을 전송합니다.

관련 문제