Ошибка сегментации wcstombs - PullRequest
       18

Ошибка сегментации wcstombs

0 голосов
/ 17 февраля 2010

этот код

int
main (void)
{
  int i;  
  char pmbbuf[4]; 

  wchar_t *pwchello = L"1234567890123456789012345678901234567890";

  i = wcstombs (pmbbuf, pwchello, wcslen(pwchello)* MB_CUR_MAX + 1);

  printf("%d\n", MB_CUR_MAX);
  printf ("   Characters converted: %u\n", i);
  printf ("   Multibyte character: %s\n\n", pmbbuf);

  return 0;
}

и странно то, что он компилируется без предупреждений.

когда я бегу ./a.out это напечатано 1 Преобразовано символов: 40 Многобайтовый символ: 1234 (

Ошибка сегментации

Есть идеи по поводу ошибки сегмента?

ТИА, cateof

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Вы столкнулись с переполнением буфера, потому что вы не завершаете буфер нулем после преобразования, а размер буфера также недостаточен для хранения результата.

Вы можете выделять память динамически, поскольку заранее не знаете, сколько памяти требуется:

int i;
char pmbbuf*;
wchar_t *pwchello = L"1234567890123456789012345678901234567890";
// this will not write anything, but return the number of bytes in the result
i = wcstombs (0, pwchello, wcslen(pwchello)* MB_CUR_MAX + 1);
//allocate memory - +1 byte for the trailing null, checking for null pointer returned omitted (though needed)
pmbbuf = malloc( i + 1 );
i = wcstombs (pmbbuf, pwchello, wcslen(pwchello)* MB_CUR_MAX + 1);
//put the trailing null
pmbbuf[i] = 0;
//whatever you want to do with the string - print, e-mail, fax, etc.
// don't forget to free memory
free( pmbbuf );
//defensive - to avoid misuse of the pointer 
pmbbuf = 0;
2 голосов
/ 17 февраля 2010

Вы пытаетесь поместить строку, которая определенно длиннее 4 символов, в массив символов, который может содержать 4 символа. Поскольку вы не указываете «4» в качестве максимального размера, преобразование запишет в память, которой он не владеет или которая может использоваться другими переменными, храня данные, такие как возвращаемые значения функции в стеке или аналогичные. Это приведет к ошибке seg, так как вы перезаписываете данные, которые были помещены в стек (стеки растут сверху вниз) перед тем, как вы вызвали wcstombs.

...