2014-11-09 3 views
0

char [] [] 유형 (일명 문자열 배열)의 데이터를 사용하여 execvp를 실행하려고합니다. 이제는 execvp()이 첫 번째 매개 변수로 문자열에 대한 포인터를 가져 와서 두 번째 문자열 배열에 대한 포인터를 사용한다는 사실을 알게되었습니다. 사실 내가 전에 성공적으로 사용한 적이 있습니다. 그러나 올바른 조합을 얻을 수없는 것 같습니다. 포인터 & 아래에서 작동하도록 문자열을 - 내가 뭘하려고하면 호환되지 않는 것으로 간주됩니다!2D 배열 매개 변수에서 execvp 실행

어떤 도움이라도 매우 감사드립니다 :) - 코드를 약간 압축하여 헤더를 제거했습니다!

struct userinput { 
    char anyargs[30][30]; //The tokenised command 
}; 

int main() { 

    struct userinput input = { { { 0 } } }; //I believe is valid to set input to 0's 
    struct userinput *inPtr = &input; //Pointer to input (direct access will be unavailable) 

    strcpy(inPtr->anyargs[0], "ls"); //Hard code anyargs to arbitary values 
    strcpy(inPtr->anyargs[1], "-lh"); 

    char (*arrPointer)[30]; //Pointer to an array of char * 
    arrPointer = &(inPtr->anyargs[0]); 

    printf("arrPointer[0]: %s, arrPointer[1]: %s\n", arrPointer[0], 
      arrPointer[1]); 

    printf("At exec case; "); 
    execvp(arrPointer[0], arrPointer); 
    perror("Command not recognised"); //Prints string then error message from errno 

    return 0; 
} 
+0

'arrPointer = (inPtr-> anyargs);를 쓰지 않으셨습니까? &? – Christophe

+0

예 - 제가 틀렸다면 -> 연산자가 참조를 해제하고 값을 반환합니다. arrPointer 및 execvp가 값을 직접 가져 가지 않으므로 값을 가리키는 포인터가 필요하지 않습니다. – davidhood2

답변

2

const char에 대한 포인터의 배열을 필요는. 이것은 char * const * 또는 char * const [] 하나 같이 쓸 수있다.

당신은 그러나 30 문자의 배열을 가지고 -long 배열, 포인터 배열되지. 두 유형은 어느 한 방향으로 다른 하나의 전환 교체 호환되지 아닌 아니다.

이 줄

char (*arrPointer)[30]; //Pointer to an array of char * 
,

char * 배열에 대한 포인터를 잘못 선언하려고합니다. 대신 선언 된 것은 char[30]에 대한 포인터이며 execvp과 매우 다릅니다.

arrPointer = &(inPtr->anyargs[0]); 

당신이 char*의 배열에 대한 포인터를 선언 할 경우에도 가능성이 정확하지 않을 수 char[30]에 대한 포인터와 char*의 배열에 대한 포인터를 초기화하는 취지 다음 줄 오른쪽 때문에 할당 측이 char*의 배열에 대한 포인터가 아니고, char[30]에 대한 포인터이고 캐스트, 인덱스, 주소 및 참조 해제 시퀀스가 ​​서로 바뀌지 않습니다.

char 30 포인터의 배열은 다음과 같이 선언 : char에 대한 포인터의

char* arguments[30]; 

동적으로 크기의 배열은 다음과 같이 구성되어 있습니다

char** arguments = calloc (nargs, sizeof(char*)); 

당신이 중 하나를 사용할 필요가 execvp에 전화하기를 원하는 경우.

어느 경우이든 포인터 배열의 각 포인터는 개별 NUL 종료 문자 배열 (가능하면 char[30][30] 배열의 요소)을 가리 키도록 초기화되어야하고 마지막 포인터 (우리가 전달하고자하는 모든 인수 후에 포인터))을 NULL로 설정해야합니다. (나는 당신이 어떻게 char[30][30]에 NULL을 찾을 것으로 예상하는지 궁금해.)

2

char *const argv[]execvp() 인자로 기대한다. 이것은 char에 대한 포인터의 배열을 의미합니다. 이것은 char[30][30]과는 다르며 메모리에 30x30 연속 문자로 표시됩니다 (포인터가 없으므로).

inPtr->anyargs[0] = "ls"; //Hard code (or use strdup()) 
inPtr->anyargs[1] = "-lh"; 
inPtr->anyargs[2] = NULL; // end of the argument list !!! 
char **arrPointer; //Pointer to an array of char * 
arrPointer = inPtr->anyargs; 

:이 문제를 해결하기 위해

할당 직접 포인터,

struct userinput { 
    char *anyargs[30]; //space for 30 char* pointers 
}; 

당신은뿐만 아니라 char**anyargs을 정의하고 동적 경우와 (char**)calloc(number_of_args+1,sizeof(char*))

나중에 initalize 수있는 당신의 구조를 정의 편집 :주의 : "포인터의 배열은 뮤 st는 NULL 포인터로 종료됩니다. ".

C. execvp에서 char[][] 같은 건 없다