C: сбой initstate_r - PullRequest
       15

C: сбой initstate_r

1 голос
/ 12 ноября 2010

Я получаю сбой при попытке использовать initstate_r:

(gdb) run
Starting program: /home/user/test.out

Program received signal SIGSEGV, Segmentation fault.
0x40052d00 in initstate_r () from /lib/libc.so.6

Код:

#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define STATELEN    256             /* random number state buffer */

main()
{
 char randomStateBuffer[STATELEN];
 struct random_data randData;

 printf("Before initstate");
   /* seed the random number generator */
    initstate_r (time(NULL), (char *)&randomStateBuffer, STATELEN,
   (struct random_data *)&randData);
 printf("initstate done");

}

Я попытался скомпилировать это в gcc 3.3.6 и 4.3.3и у обоих крушение.

Ответы [ 4 ]

2 голосов
/ 12 ноября 2010

Глядя на сигнатуру функции, второй аргумент - это просто символ *.Уберите адрес оператора из randomStateBuffer.

initstate_r (time(NULL), randomStateBuffer, STATELEN,
            (struct random_data *)&randData);

?

2 голосов
/ 12 ноября 2010

Этот вопрос выглядит удивительно похожим на:

http://www.linuxquestions.org/questions/programming-9/crash-in-initstate_r-408757/

Также см .:

http://lists.debian.org/debian-glibc/2006/01/msg00037.html

и:

http://lists.debian.org/debian-glibc/2005/08/msg00492.html

Страницу руководства для этой функции сложно понять, но, возможно, rand_data следует инициализировать перед переходом к initstate_r

2 голосов
/ 12 ноября 2010

Попробуйте обнулить структуру randData перед вызовом initstate_r ().
memset( &randData, 0, sizeof( random_data ) );
(Подсказка с этой страницы: http://sourceware.org/bugzilla/show_bug.cgi?id=3662)

1 голос
/ 26 июня 2015

Я столкнулся с такими же трудностями, и это сработало, обнулив оба состояния и rand_data, а в вашем случае удаление & перед буфером:

char randomStateBuffer[STATELEN];
struct random_data randData;
memset(randomStateBuffer, 0, sizeof(randomStateBuffer));
memset(&randData, 0, sizeof(struct random_data));
initstate_r(time(NULL), randomStateBuffer,sizeof(randomStateBuffer), &randData);

мне помогло.

...