2014-03-27 3 views
1

나는 프로그래밍 클래스 중 하나에 대한 셸을 생성합니다. 나는 commandLine 클래스가 쉘에 입력 된 명령을 구문 분석하고, argv를 동적으로 할당하고 명령의 수에 따라 argc를 설정하기위한 클래스이다. 내가 왜 argv에 대한 배열에 대한 포인터 배열을 동적으로 할당 한 후에 세분화 오류가 발생하는지 알 수 없다.이상한 세그먼테이션 오류 동적으로 배열을 할당 할 때

이것은 클래스의 생성자입니다. 왜 내가이 잘못을 저지르고 있는지 알 수있는 사람이 있다면, 나는 어떤 도움을 주셔서 감사합니다. 감사

CommandLine::CommandLine(istream& in){ 
    char * userInput = new char[256]; 
    char * pointer = &userInput[0]; 

    char cmdStorage[128][32]; 
    int cmdLength = 0; 
    int argCount = 0; 
    in.getline(userInput,256); 

    while(1) 
    { 
     if (*pointer == ' ' || *pointer == '\0') 
     { 
      if (cmdLength != 0) 
       argCount++; 

      cmdLength = 0; 
      if (*pointer == '\0') 
       break; 
     } 
     else 
     { 
      cmdStorage[argCount][cmdLength] = *pointer; 
      cmdLength++; 
     } 

     pointer++; 
    } 

    *argv = (char *) calloc(argCount,sizeof(char*)); 


    for (int i = 0; i < argCount; i++) 
    { 
     argv[i] = (char *) calloc(33,sizeof(char)); 
     memcpy(argv[i],cmdStorage[i],sizeof(cmdStorage[i])); 
    } 
    argc = argCount; 
} 
+0

C++ 방식으로 시도해 볼 수 있을까요? 아니면 C로 설정되어 있습니까? –

+0

'char *'대신'calloc (argCount, sizeof (char))','char'을 사용했다고 생각합니다. – brokenfoot

+0

아마도 문제는 아니지만 'cmdLength'가 범위 내에 있는지 확인해야합니다. 어떤 입력이 segv를 발생 시키는가? – Keith

답변

0

오류가 여기에 있습니다 :

memcpy(argv[i],cmdStorage[i],sizeof(cmdStorage[i])); 

sizeof(cmdStorage[i])

> argv[i] 포인트 블록의 크기입니다.

관련 문제