Несколько случаев плохого джиу-джуджа, наиболее подходящим из которых является:
int counter = 0;
char* data[counter];
Вы только что объявили data
как массив переменной длины с нулевыми элементами .Несмотря на свое название, VLA не являются действительно переменными;Вы не можете изменить длину массива после его выделения.Поэтому, когда вы выполняете строки,
data[counter]=(char*)malloc(sizeof(char)*(length)+1);
strncpy(data[counter], bytes+start, length);
data[counter]
ссылается на память, которой вы не владеете, вы вызываете неопределенное поведение.
Поскольку вы не знаете, сколькоСтроки, которые вы читаете из файла заранее, вам нужно создать структуру, которая может динамически расширяться.Вот пример:
/**
* Initial allocation of data array (array of pointer to char)
*/
char **dataAlloc(size_t initialSize)
{
char **data= malloc(sizeof *data * initialSize);
return data;
}
/**
* Extend data array; each extension doubles the length
* of the array. If the extension succeeds, the function
* will return 1; if not, the function returns 0, and the
* values of data and length are unchanged.
*/
int dataExtend(char ***data, size_t *length)
{
int r = 0;
char **tmp = realloc(*data, sizeof *tmp * 2 * *length);
if (tmp)
{
*length= 2 * *length;
*data = tmp;
r = 1;
}
return r;
}
Затем в вашей основной программе вы объявите data
как
char **data;
с отдельной переменной для отслеживания размера:
size_t dataLength = SOME_INITIAL_SIZE_GREATER_THAN_0;
Вы бы изначально выделили массив как
data = dataAlloc(dataLength);
.Затем в цикле вы сравниваете свой счетчик с текущим размером массива и расширяете массив, когда они сравниваются равными, например:
if (counter == dataLength)
{
if (!dataExtend(&data, &dataLength))
{
/* Could not extend data array; treat as a fatal error */
fprintf(stderr, "Could not extend data array; exiting\n");
exit(EXIT_FAILURE);
}
}
data[counter] = malloc(sizeof *data[counter] * length + 1);
if (data[counter])
{
strncpy(data[counter], bytes+start, length);
data[counter][length] = 0; // add the 0 terminator
}
else
{
/* malloc failed; treat as a fatal error */
fprintf(stderr, "Could not allocate memory for string; exiting\n");
exit(EXIT_FAILURE);
}
counter++;