0

私はこの次のコードを持っています:

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;
}

ここでは、int で SEGV 信号を取得していますlen = strlen(trimmed_id_tran_typ_);

トリム文字列関数は次のようなものです:

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_;
}

ここで、なぜここでセグメンテーション違反が発生するのかという私の質問は明らかです。

set()関数によって送信された関数で文字列を受信して​​いないためtrimString()ですか?


これはどのように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);
}
4

2 に答える 2

0

最も可能性の高い説明は、Class::setメソッドがid_tran_type_set toで呼び出されていること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;
}
于 2013-06-28T15:34:17.987 に答える
0

STRDUP関数が null ポインターを返すかid_tran_typ_、null ポインターです。

于 2013-06-28T13:07:07.437 に答える