Решено: Функция iconv вызывает SIGSEGV

Модератор: Модераторы разделов

Аватара пользователя
aralex
Сообщения: 5

Решено: Функция iconv вызывает SIGSEGV

Сообщение aralex »

Подскажите, pls, что тут может быть не так?

Код: Выделить всё

#include <stdio.h>
#include <iconv.h>
#include <errno.h>
#include <string.h>

#define STR_MAX        100

int main( void )
{
  char OrigStr[ STR_MAX + 1 ] = "Привет!";
  char ResStr[ STR_MAX + 1 ];
  size_t OrigSize = strlen( OrigStr );
  size_t ResultSize = STR_MAX;

  iconv_t cd = iconv_open( "UTF8", "KOI8-R" );

  if( cd == ( iconv_t )-1 ) { perror( strerror( errno ) ); return( 1 ); }

  size_t Converted = iconv( cd, ( char ** )&ResStr, &ResultSize, ( char ** )&OrigStr, &OrigSize );

  if( Converted == ( size_t )-1 ) perror( strerror( errno ) );
  else printf( "original: %s\nresult: %s\n", OrigStr, ResStr );

  iconv_close( cd );
  return( 0 );
}


Что-то определённо не так, потому что на вызове iconv программа получает SIGSEGV.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: Решено: Функция iconv вызывает SIGSEGV

Сообщение /dev/random »

В iconv сначала указывается вход, затем выход, а не наоборот.
Спасибо сказали:
Аватара пользователя
aralex
Сообщения: 5

Re: Решено: Функция iconv вызывает SIGSEGV

Сообщение aralex »

/dev/random писал(а):
10.10.2010 22:52
В iconv сначала указывается вход, затем выход, а не наоборот.


Верно. Попутал в процессе отладки... Но исходный вариант был правильным. Только итог тот же - SIGSEGV.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: Решено: Функция iconv вызывает SIGSEGV

Сообщение /dev/random »

Ещё одна ошибка (не знаю, последняя ли): iconv изменяет значения переданных ему указателей. Указатель, объявленный как массив, изменить нельзя. Собственно, компилятор вам об этом говорил, пока вы ему не заткнули рот явным преобразованием типа (char**). Никогда не игнорируйте подобных предупреждений.

Исправляется это так: объявляете 2 указателя char *in = OrigStr, *out = ResStr; и передаёте iconv'у их.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Решено: Функция iconv вызывает SIGSEGV

Сообщение Rootlexx »

А точно SIGSEGV приходит при вызове iconv(), а не, скажем, printf()?
Спасибо сказали:
Аватара пользователя
aralex
Сообщения: 5

Re: Решено: Функция iconv вызывает SIGSEGV

Сообщение aralex »

/dev/random писал(а):
11.10.2010 00:58
Ещё одна ошибка (не знаю, последняя ли): iconv изменяет значения переданных ему указателей. Указатель, объявленный как массив, изменить нельзя. Собственно, компилятор вам об этом говорил, пока вы ему не заткнули рот явным преобразованием типа (char**). Никогда не игнорируйте подобных предупреждений.

Исправляется это так: объявляете 2 указателя char *in = OrigStr, *out = ResStr; и передаёте iconv'у их.


Действительно, дело оказалось в этом (уже и сам успел дойти :)). Теперь работает. Спасибо за мудрые советы ;)
Спасибо сказали: