Как домашнее задание, я должен создать 2 функции, которые позволят вам нажимать и выталкивать элементы в массив, который действует как очередь. Мы должны делать это, динамически выделяя память. Моя программа почти работает, но иногда, когда вы добавляете и удаляете слишком много элементов, я получаю такие ошибки, как «realloc(): недопустимый следующий размер», double free (когда я только вызывал свободную функцию один раз), а некоторые из элементов в начало очереди установлено на 0. Например, если я сначала добавлю 100 элементов, а затем удаляю 90 и пытаюсь добавить еще 20, я получаю «free(): недопустимый следующий размер (быстрый): 0x0000000001ea6010». Что я здесь делаю неправильно?realloc(): недействительный следующий размер и двойной бесплатный
В соответствии с предложениями ниже я изменил свои функции, чтобы использовать двойной указатель как вход для массива. Это, однако, теперь дает мне ошибку Сегментация - это значит, теперь я не знаю, что искать на всех ...
#include <stdio.h>
#include <stdlib.h>
void enqueue(int **arr, int* lastElementIdx, size_t* totalElements, int element) {
if (*lastElementIdx >= *totalElements) { // check if memorry is sufficient, otherwise double
*totalElements *= 2;
int* temp = realloc(arr, (*totalElements * sizeof(int)));
if (temp == NULL) { // just in case realloc fails
printf("Allocation error\n");
} else {
*arr = temp;
}
}
if (*lastElementIdx <= *totalElements) {
*lastElementIdx += 1; // once everything is done: add element
*arr[*lastElementIdx] = element;
}
}
int dequeue(int **arr, int* lastElementIdx, size_t* totalElements) {
if (*lastElementIdx > -1) { // if queue is not empty...
int deleted = *arr[0]; // save deleted value first (in case it's still needed)
for (int i = 0; i <= *lastElementIdx; i++) { // shift all elements
*arr[i] = *arr[i + 1];
}
*lastElementIdx -= 1; // index is now decreased by 1
if (((*totalElements/2) >= 10) && ((*lastElementIdx + 1) < (*totalElements/2))) { // cut memory in half if not needed
*totalElements /= 2;
*arr = realloc(arr, (*totalElements * sizeof(int)));
int* temp = realloc(arr, (*totalElements * sizeof(int)));
if (temp == NULL) { // in case realloc fails
printf("Allocation error\n");
return 0;
} else {
*arr = temp;
}
}
return deleted;
} else { // if queue is empty, print that there's nothing to dequeue
printf("There are no elements inside the queue\n");
return 0;
}
}
void printQueue(int arr[], int lastElementIdx) {
for (int i = 0; i <= lastElementIdx; i++) { // print entire queue
printf("[%d] = %d\n", i, arr[i]);
}
printf("\n");
}
int main (void) {
size_t totalElements = 10; // number of needed elements at the time
int lastElementIdx = -1; // index of last element in queue at the time
int *arr = calloc(totalElements, sizeof(int));
int **arrpointer = &arr;
for (int i = 1; i < 101; i++) {
enqueue(arrpointer, &lastElementIdx, &totalElements, i);
}
printQueue(arr, lastElementIdx);
for (int i = 0; i < 90; i++) {
dequeue(arrpointer, &lastElementIdx, &totalElements);
}
printQueue(arr, lastElementIdx);
for (int i = 1; i < 21; i++) {
enqueue(arrpointer, &lastElementIdx, &totalElements, i);
}
printQueue(arr, lastElementIdx);
free(arr);
return EXIT_SUCCESS;
}
Обработка ошибок - это больше, чем просто печать сообщения, но в противном случае игнорирование ошибки. – Olaf
BTW Не сравнивайте переменные size_t и '-1'. – BLUEPIXY
Запустите программу в отладчике, и вы увидите, что ваша программа пыталась сделать, что вызвало segfault. – immibis