Почему вызов calloc может привести к повреждению памяти, а malloc работает нормально

Я писал простую инверсионную программу с использованием сортировки слиянием. При выделении памяти во время выполнения с помощью 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 я обнаружил, что это своего рода проблема с повреждением памяти, но не получил ее четко

-1

Решение

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>,

3

Другие решения

Ваш 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 называть себя неудачным, а скорее последующим кодом, который пытается что-то сделать с указателем?

1