2012-02-18 7 views
0

I가 다음과 같은 코드 : 다음호환되지 않는 유형의 **는 char *

char *orderFiles[10]; 

그리고 내 주요 방법 :

int main(int argc, char *argv[]) 
{ 
    orderFiles = argv; 
} 

전역 변수로

그러나 그것은 나에게 오류를주고있다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

C++가 아닌 C로 다시 태그해야합니다. –

+0

_both_ 언어에 적용되므로 C로 태그도 지정하십시오. – paxdiablo

답변

2

char *x[10]은 수정할 수없는 10 개의 char 포인터 배열을 제공하므로 오류가 발생합니다. 즉, x에 할당 할 수 없으며 어떤 식 으로든 변경할 수 없습니다. 해당 변경 가능 버전은 char **orderFiles 일 수 있습니다. argv을 할당하면됩니다. 여담으로

, 따라서 귀하의 배열에 당신 전송 개별 인수 :

for (i = 0; i <= argc && i < sizeof(orderFiles)/(sizeof(*orderFiles); i++) 
    orderFiles[i] = argv[i]; 

하지만 오히려 복잡한 것 같다. 첫 번째 N 인수를 사용하여 orderFiles을 채우거나 부분적으로 채워서 다음 하나를 NULL로 만듭니다. 그들이 액세스 할 수 있도록 그 코드가 전역에 인수를 저장

#include <stdio.h> 

char **orderFiles; 
int orderCount; 

static void someFn (void) { 
    int i; 
    printf ("Count = %d\n", orderCount); 
    for (i = 0; i < orderCount; i++) 
     printf ("%3d: [%s]\n", i, orderFiles[i]); 
    // or, without orderCount: 
    // for (i = 0; orderFiles[i] != NULL; i++) 
    //  printf ("%3d: [%s]\n", i, orderFiles[i]); 
    // printf ("Count was %d\n", i); 

} 

int main (int argc, char **argv) { 
    orderCount = argc; 
    orderFiles = argv; 
    someFn(); 
    return 0; 
} 

: 당신의 의도는 당신이 어디를 참조 할 수 있도록 글로벌에 인수를 멀리 은닉하는 것입니다 경우

, 당신은 뭔가를해야 다른 기능으로 argv[argc] 호스팅 환경에 NULL이 보장되기 때문에 기술적으로, 그것은 필요는 없습니다,하지만 당신은뿐만 아니라 argc을 사용하려는 경우

당신은 main에 두 인수를 저장해야합니다 - 당신은 인수 배열의 끝을 감지하는 것을 사용할 수 있습니다.

+0

이 작업을 수행하면 내 인수 배열의 세 번째 요소를 말하도록 어떻게 내용에 액세스 할 수 있습니까? – Nosrettap

+1

@Nosrettap :'orderFiles [2]' – Mankarse

+0

@Mankarse는'main'에서'argv'에 액세스하는 것과 똑같이 전역 적으로 액세스 할 수 있습니다. 방법에 답을 추가하겠습니다. – paxdiablo

0

orderFiles는 const char **이므로 수정할 수 없습니다 (배열 포인터 자체).

배열 구성원을 할당 할 수 있습니다 (예 : orderFiles [0] = argv [0] 등).

+0

'orderFiles'는'char * [10]', ** **'const char **'가 아닙니다. 이것은 묵시적으로'char ** '로 변환 될 수 있지만 그러한 변환의 결과는 prvalue이므로 할당 할 수 없습니다. – Mankarse

0

길이가 초기화되지 않은 배열과 초기화되지 않은 배열 사이에는 차이가 있습니다. 전역 변수 선언에서 10을 제거하면 작동합니다.

이 이유는 argv가 실제로는 char * *이지만, orderFiles는 10 char *의 배열입니다.

0

orderFiles에 대해 암시 적으로 char**이 있지만 크기가 [10] 인 링크 시간 할당 된 블록으로 초기화했기 때문에 일정합니다. char**이 아닌 정수 또는 memcpyargv에서 배열로 만들어야합니다.

0

두 가지 다른 데이터 유형이 모두 비슷합니다. argv는 C- 문자열의 배열이고 orderFiles는 단일 C- 문자열로 선언됩니다.

그래서 orderFiles를 할당하는 방법은 수행하려는 작업에 따라 다릅니다.일반적으로 인수를 응용 프로그램에 전달하려면 argv를 반복합니다. argv [0]은 응용 프로그램 이름입니다.

관련 문제