Ошибка сегментации в gSoap. Низший остановился, потому что получил сигнал от операционной системы.

У меня есть указатель, и когда я его разыменовываю, он выдает ошибку. Проблема в том, что параметр *ns__personRequestResponse

int __ns3__PersonRequest(soap *, _ns1__PersonRequest *ns1__PersonRequest, _ns1__PersonRequestResponse *ns1__PersonRequestResponse)
{
    ns1__PersonRequestResponse->result = 0;
    //ns1__PersonRequestResponse = new _ns1__PersonRequestResponse();
    *ns1__PersonRequestResponse->result = 39; // Error here
    return SOAP_OK;
}

Ниже приведена часть заголовочного файла, созданного из wsdl, с параметром ответа.

class _ns1__PersonRequestResponse
{ 
  public:
     /// Element result of type xs:int.
     int*                                 result                         0; ///< Nullable pointer.
     /// A handle to the soap struct that manages this instance (automatically set)
     struct soap                         *soap                          ;
};

Я получаю ошибку сегментации, когда присваиваю значение результату целочисленной переменной. Как я могу заставить его работать?


person Kahn    schedule 26.06.2013    source источник


Ответы (1)


Поле результата в вашей структуре является указателем на int. В своем коде вы сначала инициализируете его значением 0, а затем пытаетесь присвоить значение этому указателю. Но в большинстве систем это не удастся, потому что память по адресу 0 не выделена вашей программе.

Исправление заключается в том, чтобы убедиться, что result указывает на действительную память, прежде чем пытаться назначить через этот указатель. Как именно это должно происходить, зависит от того, как эта структура будет использоваться в вашем коде. Одним из способов было бы объявить переменную int вне вашей функции (возможно, в области файла), затем взять ее адрес и присвоить ее result:

int my_result;  // This should be declared OUTSIDE of a function!

int __ns3__PersonRequest(soap *, _ns1__PersonRequest *ns1__PersonRequest, _ns1__PersonRequestResponse *ns1__PersonRequestResponse)
{
    ns1__PersonRequestResponse->result = &my_result;  // Make sure pointer points to valid memory
    *ns1__PersonRequestResponse->result = 39; // Updates the value of my_result
    return SOAP_OK;
}
person Jim Lewis    schedule 26.06.2013
comment
Выдает ошибку по этому поводу. ошибка: неверное преобразование из 'int' в 'int*' [-fpermissive] - person Kahn; 26.06.2013
comment
@Hesper: Вы уверены, что поле результата в этой структуре действительно объявлено как целое число? Возможно, у вас есть ненужный * в объявлении структуры ... вам, вероятно, следует отредактировать свой вопрос, чтобы включить объявление. - person Jim Lewis; 26.06.2013
comment
Теперь я включил часть заголовочного файла с определением ns1__PersonRequestResponse. Звезда необходима как возвращаемый тип gsoap, и она должна быть указателем. - person Kahn; 27.06.2013
comment
@Hesper: Похоже, ваша проблема связана с попыткой присвоения нулевого указателя. Вам нужно инициализировать значение указателя на допустимую память, принадлежащую вашему процессу; Я обновил свой ответ, чтобы показать один из возможных способов сделать это. - person Jim Lewis; 27.06.2013