2013-06-28 32 views
0

我有這個下面的代碼字符串的長度:以int len = strlen(trimmed_id_tran_typ_);SEGV信號而得到

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()函數中的字符串?


這是STRDUP()的樣子:

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_是一個空指針。

+0

這就是STRDUP函數的外觀 – Mariners

0

最可能的解釋是Class::set方法正在調用id_tran_type_設置爲NULL。您可以通過在檢查長度前檢查trimmed_id_tran_typ_值是否爲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; 
}