1oid ReadBinary(char *infile,HXmap* AssetMap)
{
int fd;
size_t bytes_read, bytes_expected = 100000000*sizeof(char);
char *data;
if ((fd = open(infile,O_RDONLY)) < 0)
err(EX_NOINPUT, "%s", infile);
if ((data = malloc(bytes_expected)) == NULL)
err(EX_OSERR, "data malloc");
bytes_read = read(fd, data, bytes_expected);
if (bytes_read != bytes_expected)
printf("Read only %d of %d bytes %d\n", \
bytes_read, bytes_expected,EX_DATAERR);
/* ... operate on data ... */
printf("\n");
int i=0;
int counter=0;
char ch=data[0];
char message[512];
Message* newMessage;
while(i!=bytes_read)
{
while(ch!='\n')
{
message[counter]=ch;
i++;
counter++;
ch =data[i];
}
message[counter]='\n';
message[counter+1]='\0';
//---------------------------------------------------
newMessage = (Message*)parser(message);
MessageProcess(newMessage,AssetMap);
//--------------------------------------------------
//printf("idNUM %e\n",newMessage->idNum);
free(newMessage);
i++;
counter=0;
ch =data[i];
}
free(data);
}
Здесь я выделил 100 МБ данных с помощью malloc и передал файл достаточно большого (не 500 МБ) размера около 926 КБ. Когда я передаю небольшие файлы, он читает и выходит, как талисман, но когда я передаю достаточно большой файл, программа выполняется до некоторой точки, после которой она просто зависает. Я подозреваю, что он либо вошел в бесконечный цикл, либо произошла утечка памяти.
РЕДАКТИРОВАТЬ Для лучшего понимания я убрал все ненужные вызовы функций и проверил, что происходит, когда в качестве входных данных используется большой файл. Я приложил измененный код
void ReadBinary(char *infile,HXmap* AssetMap)
{
int fd;
size_t bytes_read, bytes_expected = 500000000*sizeof(char);
char *data;
if ((fd = open(infile,O_RDONLY)) < 0)
err(EX_NOINPUT, "%s", infile);
if ((data = malloc(bytes_expected)) == NULL)
err(EX_OSERR, "data malloc");
bytes_read = read(fd, data, bytes_expected);
if (bytes_read != bytes_expected)
printf("Read only %d of %d bytes %d\n", \
bytes_read, bytes_expected,EX_DATAERR);
/* ... operate on data ... */
printf("\n");
int i=0;
int counter=0;
char ch=data[0];
char message[512];
while(i<=bytes_read)
{
while(ch!='\n')
{
message[counter]=ch;
i++;
counter++;
ch =data[i];
}
message[counter]='\n';
message[counter+1]='\0';
i++;
printf("idNUM \n");
counter=0;
ch =data[i];
}
free(data);
}
Похоже, он печатает множество idNUM
, а затем poof segmentation fault
Я думаю, что это интересное поведение, и мне кажется, что есть проблема с памятью
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ Я вернул обратно i!=bytes_read
, это не дает ошибки сегментации. Когда я проверяю i<=bytes_read
, он выходит за пределы внутренней петли. (Любезно предоставлено GDB)