I가 다음과 같은 코드 : 다음호환되지 않는 유형의 **는 char *
char *orderFiles[10];
그리고 내 주요 방법 :
int main(int argc, char *argv[])
{
orderFiles = argv;
}
전역 변수로
그러나 그것은 나에게 오류를주고있다. 내가 도대체 뭘 잘못하고있는 겁니까?
I가 다음과 같은 코드 : 다음호환되지 않는 유형의 **는 char *
char *orderFiles[10];
그리고 내 주요 방법 :
int main(int argc, char *argv[])
{
orderFiles = argv;
}
전역 변수로
그러나 그것은 나에게 오류를주고있다. 내가 도대체 뭘 잘못하고있는 겁니까?
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
에 두 인수를 저장해야합니다 - 당신은 인수 배열의 끝을 감지하는 것을 사용할 수 있습니다.
orderFiles는 const char **
이므로 수정할 수 없습니다 (배열 포인터 자체).
배열 구성원을 할당 할 수 있습니다 (예 : orderFiles [0] = argv [0] 등).
'orderFiles'는'char * [10]', ** **'const char **'가 아닙니다. 이것은 묵시적으로'char ** '로 변환 될 수 있지만 그러한 변환의 결과는 prvalue이므로 할당 할 수 없습니다. – Mankarse
길이가 초기화되지 않은 배열과 초기화되지 않은 배열 사이에는 차이가 있습니다. 전역 변수 선언에서 10을 제거하면 작동합니다.
이 이유는 argv가 실제로는 char * *이지만, orderFiles는 10 char *의 배열입니다.
orderFiles
에 대해 암시 적으로 char**
이 있지만 크기가 [10]
인 링크 시간 할당 된 블록으로 초기화했기 때문에 일정합니다. char**
이 아닌 정수 또는 memcpy
을 argv
에서 배열로 만들어야합니다.
두 가지 다른 데이터 유형이 모두 비슷합니다. argv는 C- 문자열의 배열이고 orderFiles는 단일 C- 문자열로 선언됩니다.
그래서 orderFiles를 할당하는 방법은 수행하려는 작업에 따라 다릅니다.일반적으로 인수를 응용 프로그램에 전달하려면 argv를 반복합니다. argv [0]은 응용 프로그램 이름입니다.
C++가 아닌 C로 다시 태그해야합니다. –
_both_ 언어에 적용되므로 C로 태그도 지정하십시오. – paxdiablo