Filling szBufferState with random data is completely unnecessary, initstate_r overwrites it anyway. If you want to initialize randomdataState the same way srandom(seconds); does, don't open /dev/urandom at all and just do: static int buf[32]; memset (randomdataState, 0, sizeof (*randomdataState)); initstate_r (seconds, (char *) buf, 128, &randomdataState);
Jakub, I have tried to do what you propose but the following code is throwing an error in execution time: ### prueba-3.c ################################################## #include <stdio.h> #include <stdlib.h> #include <fcntl.h> int bucle_random_r() { int nRandom; struct random_data *randomdataState; static int buf[32]; time_t seconds; extern void *memset (void *__s, int __c, size_t __n) __THROW; memset(randomdataState, 0, sizeof(*randomdataState)); initstate_r(seconds, (char *) buf, 128, randomdataState); random_r(randomdataState, &nRandom); printf("%d\n", nRandom); return 1; } int main(int argc, char ** argv) { bucle_random_r(); return (0); } ################################################################# This is the result: # gcc prueba-3.c -o 3prueba -Wall -pedantic -O0 #./3prueba Segmentation fault The "Segmentation fault" occurs when executing memset instruction. I don't know why ...