Весь ваш код вызывает неопределенное поведение, потому что вы передаете string
, который является неинициализированным указателем, доступ к которому может "не" гарантироваться для 11 байтов, к которым вы обращаетесь в функции rand_string()
.
Вам необходимо выделить память из main()
и передать этот буфер для заполнения функцией генератора случайных строк, таким образом вы получите контроль над изменяемой памятью.
Также for
l oop в вашем генераторе уже заполняет индексы от 0
до 9
. Чтобы установить последний байт в NULL, вам нужно использовать индекс как 10.
Также заголовки time.h
и unistd.h
здесь бесполезны. Вот перезапись той же программы с выделенной памятью через malloc()
. Также изменил вашу функцию rand_string()
на void вместо возврата строки.
#include <stdio.h>
#include <stdlib.h>
void rand_string(char *str);
int main()
{
int dimensione= 15;
char *string = malloc(11 * sizeof *string); // extra byte for NULL
if (!string) return 1;
int i;
for(i=0;i<dimensione;i++)
{
rand_string(string);
printf("%s\n", string);
}
free(string);
return 0;
}
void rand_string(char *str)
{
const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK";
int i;
for ( i = 0; i < 10; i++)
{
int key = rand() % (int) (sizeof charset - 1);
str[i] = charset[key];
}
str[10] = '\0';
}
Всегда компилируйте с дополнительными флагами, чтобы включить всевозможные предупреждения от вашего компилятора. Например, с gcc
всегда добавляйте -Wall -Wextra
, чтобы увидеть предупреждения, которые вы можете исправить со своей стороны.