2013-06-28 1 views
0

문자열의 길이를 가져 오는 동안 :SEGV 신호는 I이 다음 코드 데

: INT len = strlen(trimmed_id_tran_typ_);

에서 여기

int Class::set(const char * id_tran_typ_) 
{ 
     char *trimmed_id_tran_typ_ = NULL; 
     trimString(id_tran_typ_, &trimmed_id_tran_typ_); 
     int len = strlen(trimmed_id_tran_typ_); 
     if (len < 1) 
       _id_tran_typ = DEFAULT_STRING; 
     else 
       _id_tran_typ = id_tran_typ_; 
     delete[] trimmed_id_tran_typ_; 
     trimmed_id_tran_typ_ = NULL; 
     return SUCCESS; 
} 

나는 SEGV 신호를 얻고을 trimString 기능은 다음과 같이이다

char *trimString(const char *sP_, char **dP_) 
{ 

     *dP_ = NULL; 

     if (sP_ == NULL) 
       return *dP_; 

     const char *lastPos = (char *)&sP_[strlen(sP_)]; 
     const char *startPos = (char *)sP_; 
     const char *endPos = lastPos; 

     int len = strlen(sP_); 

     for (; endPos != sP_; endPos--) 
     { 
       if (*(endPos - 1) != ' ') 
       { 
         len = endPos - sP_; // *endPos = '\0'; 
         break; 
       } 
     } 
     if (len == 0) // if (*endPos != '\0') 
     { 
       *dP_ = new char[1]; 
       *dP_[0] = '\0'; 
       return *dP_; 
     } 
     for(; startPos < endPos; startPos++, len--) 
     { 
       if (*startPos != ' ') 
         break; 
     } 
     if (startPos == endPos) 
     { 
       *dP_ = new char[1]; 
       *dP_[0] = '\0'; 
       return *dP_; 
     } 

     *dP_ = STRDUP(startPos, len); 
     return *dP_; 
} 

이제 세분화 오류가 발생하는 이유는 무엇입니까?

trimString() 함수가 보낸 set() 함수에서 문자열을받지 못했습니까?

char *STRDUP(const char *sP_, const int len_) 
{ 
     if (! sP_) 
       return NULL; 
     else if (len_ < 1) 
       return NULL; 

     char *newP = new char [ len_ + 1] ; 
     memset(newP, '\0', len_+1); 
     strncpy(newP, sP_, len_); 
     return(newP); 
} 
+1

'STRDUP'은 가장 중요한 부분을 생략했습니다. –

+1

'STRDUP' 외에도'set '을 어떻게 호출할까요? –

+0

세그먼트 화 오류와 연결된 set() 호출은 어떻게 여기에 있습니까? – Mariners

답변

0

어느 당신의 STRDUP 함수는 널 포인터를 반환하거나 id_tran_typ_가 널 포인터입니다 :


는 같은 STRDUP() 보이는 방법이다.

+0

이것은 STRDUP 함수가 어떻게 보이는지입니다 – Mariners

0

가장 가능성있는 설명은 id_tran_type_NULL으로 설정하여 Class::set 메서드를 호출하는 것입니다. 길이를 확인하기 전에 NULL 값이 있는지 확인하여 문제를 해결할 수 있습니다.

int Class::set(const char * id_tran_typ_) 
{ 
    char *trimmed_id_tran_typ_ = NULL; 
    trimString(id_tran_typ_, &trimmed_id_tran_typ_); 
    if (!trimmed_id_tran_typ_ || strlen(trimmed_id_tran_typ_) < 1) 
     _id_tran_typ = DEFAULT_STRING; 
    else 
     _id_tran_typ = id_tran_typ_; 
    delete[] trimmed_id_tran_typ_; 
    trimmed_id_tran_typ_ = NULL; 
    return SUCCESS; 
}