Мой первый вопрос: как вы рассчитываете len? Это просто strlen или в нем есть место для терминатора \ 0? Я думаю, что вы, возможно, превышаете свое распределение в своей strcpy. Плохое поведение, как правило, происходит на границах слов и выглядит случайным. Кроме того, убедитесь, что исходные строки имеют нулевое завершение. Если вы допустили ошибку на стороне чтения и не прекратили их. Тогда strcpy может случайным образом перезаписывать вещи.
*(lines + slot) = (char *) malloc(len * sizeof(char));
if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
strcpy(*(lines+slot),s);
Возможно, попробуйте:
lines[slot] = (char *) malloc((len + 1) * sizeof(char));
if(lines[slot] == NULL) exit(EXIT_FAILURE);
if(strlen(s) <= len){
strcpy(lines[slot],s);
}
else{
/* do something else... */
}
С точки зрения общей формы, я бы также рекомендовал вам внести несколько стилистических изменений, чтобы сделать все это более читабельным, понятным и устойчивым к ошибкам.
Арифметика с указателями действительна и забавна, но я думаю, что ваши намерения немного более ясны, если вы используете форму массива, такую как:
free(lines[slot]);
lines[slot] = NULL;
вместо
free(*(lines+slot));
*(lines + slot) = NULL;
Я бы также посоветовал вам использовать меньше статики. Достаточно легко пройти через них в структуре данных и передать их в ваши аксессоры и мутаторы. Становится намного яснее, где происходит действие, мешающее вам делать такие вещи, как:
static int numlines = 0;
void insert_line(char *s, int len){
int numlines = 5;
, где вы можете ввести проблемы с областями видимости, которые просто не подходят для отладки.