Я писал простую инверсионную программу с использованием сортировки слиянием. При выделении памяти во время выполнения с помощью calloc я получил следующую ошибку:
a.out: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.
Aborted (core dumped)
с этим кодом:
int *temp = (int*)calloc(1, sizeof(int) * (l1+l2)) ;
при использовании malloc вместо calloc работает нормально. При поиске в Google я обнаружил, что это своего рода проблема с повреждением памяти, но не получил ее четко
void* calloc(size_t num, size_t size);
Это выделяет блок num
элементы, каждый с размером, заданным size
, Так как вы проходите 0
за num
Вы просите выделить блок с нулевыми элементами. Это, конечно, не то, что вы намеревались, и, следовательно, где-то внизу вы столкнетесь с ошибкой.
Я не уверен, что вы пытаетесь сделать. Похоже, вы пытаетесь выделить массив int
с длиной l1+l2
, В этом случае вам нужно написать:
int *temp = calloc(l1+l2, sizeof *temp);
Обратите внимание, что я предполагаю, что вы пишете C, и удалили приведение возвращаемого значения из calloc
, Если вы пишете C ++, то вы не будете звонить calloc
на первом месте. Вы бы использовали std::vector<int>
,
Ваш calloc
вызов не кажется мне очень правдоподобным. Вы размещаете нуль предметы, каждый из которых sizeof(int) * (l1+l2)
размер в байтах.
При этом я не уверен, действительно ли утверждение действительно. calloc
документация говорит:
[…]void *calloc(size_t nelem, size_t elsize);
RETURN VALUE
После успешного завершения с обоими
nelem
а такжеelsize
отличен от нуля,calloc()
должен вернуть указатель
на выделенное пространство. Если либоnelem
или жеelsize
0, то либо нулевой указатель, либо уникальный
значение указателя, которое может быть успешно переданоfree()
должен быть возвращен.
То есть по этому описанию я бы ожидал, что вы получите указатель (возможно, нулевой указатель), который не подходит ни для чего, кроме как передаваемый в free()
, Может быть, это на самом деле не calloc
называть себя неудачным, а скорее последующим кодом, который пытается что-то сделать с указателем?