ошибка кучи, программа падает после компиляции
помогите пожалуйста разобраться в коде. Я когда компилирую и выбираю один из видом сортировки, компилятор мне сортирует массив, но потом программа ломается и не работает.
include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "locale.h"
void Print(int B[], int* n);
void swap(int B[], int i)
{
int tmp;
tmp = B[i];
B[i] = B[i - 1];
B[i - 1] = tmp;
}
void randArray(int B[], int* n, int* a, int* b)
{
int i;
printf("Введите размер массива\n");
scanf_s("%d", &*n);
printf("Введите наименьший элемент в массиве\n");
scanf_s("%d", &*a);
printf("Введите наибольший элемент в массиве\n");
scanf_s("%d", &*b);
for (i = 0; i < *n; i++)
B[i] = rand() % (*b - *a) + *a;
Print(B, n);
}
void specArray(int B[], int* n)
{
int i;
printf("Введите размер массива\n");
scanf_s("%d", &*n);
printf("Введите элементы массива\n");
for (i = 0; i < *n; i++)
scanf_s("%d", &B[i]);
Print(B, n);
}
void Print(int B[], int* n)
{
int i;
for (i = 0; i < *n; i++)
{
printf("%d ", B[i]);
}
printf("\n");
}
void DibBubbleSort(int B[], int *n)
{
int leftmark = 1;
int rightmark = n - 1;
while (leftmark <= rightmark)
{
for (int i = rightmark; i >= leftmark; i--)
if (B[i - 1] > B[i]) swap(B, i);
leftmark++;
for (int i = leftmark; i <= rightmark; i++)
if (B[i - 1] > B[i]) swap(B, i);
rightmark--;
}
}
void InsertSort(int B[], int* n)
{
int i, j, pos;
for (i = 1; i < *n; i++)
{
j = B[i];
pos = i - 1;
while ((pos >= 0) && (B[pos] > j))
{
B[pos + 1] = B[pos];
pos = pos - 1;
}
B[pos + 1] = j;
}
}
void Merge(int B[], int left, int right)
{
int mid, pos1, pos2, pos3, i, *A, n=&n;
A = (int*)malloc(sizeof(int) * n);
mid = (left + right) / 2;
{
pos1 = left;
pos2 = mid + 1;
pos3 = 1;
}
while ((pos1 <= mid) && (pos2 <= right))
{
if (B[pos1] < B[pos2])
{
A[pos3] = B[pos1];
pos1++;
}
else
{
A[pos3] = B[pos2];
pos2++;
}
pos3++;
}
while (pos2 <= right)
{
A[pos3] = B[pos2];
pos2++;
pos3++;
}
for (i = 1; i < pos3 - 1; i++)
B[left + i - 1] = A[i];
free(A);
};
void MergeSort(int* B[], int left, int right)
{
if (left < right)
{
MergeSort(B, left, (left + right)/2); //сортировка левой части
MergeSort(B, (left+right)/2 + 1, right); //сортировка правой части
Merge(B, left, right); //слияние двух частей
}
};
void Split(int B[], int left, int right)
{
int mid, i, j, tmp;
mid = B[(right + left) / 2];
i = left;
j = right;
while (i < j)
{
while (B[i] < mid)
{
i++;
}
while (B[j] > mid)
{
j--;
}
if (i <= j)
{
tmp = B[i];
B[i] = B[j];
B[j] = tmp;
i++;
j--;
}
}
if (left < j)
Split(B, left, j);
if (i < right)
Split(B, i, right);
}
void QuickSort(int* B[], int* n)
{
Split(B, 0, *n - 1);
}
void menu()
{
printf("\nMENU:\n");
printf("1. Ввод заданного массива\n");
printf("2. Ввод рандомного массива\n");
printf("3. Быстрая сортировка\n");
printf("4. Сортировка двунаправленным пузырьком\n");
printf("5. Сортировка вставками\n");
printf("6. Сортировка слиянием\n");
printf("0. Exit\n");
}
void main()
{
int n = &n, a = &a, b = &b;
int* B = (int*)malloc(sizeof(int)*n);
int t = 10;
setlocale(LC_ALL, "Russian");
printf("start\n");
srand(1000);
while (t != 0)
{
menu();
scanf_s("%d", &t);
switch (t)
{
case 1: {
specArray(B, &n);
break;
}
case 2: {
randArray(B, &n, &a, &b);
break;
}
case 3: {
QuickSort(B, &n);
Print(B, &n);
break;
}
case 4: {
DibBubbleSort(B, &n);
Print(B, &n);
}
case 5: {
InsertSort(B, &n);
Print(B, &n);
}
case 6: {
MergeSort(B, 0, &n);
Print(B, &n);
}
break;
}
}
}
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Здесь
int mid, pos1, pos2, pos3, i, *A, n=&n
int n = &n, a = &a, b = &b;
int* B = (int*)malloc(sizeof(int)*n);
грубая ошибка. Целочисленной переменной n присваивается её адрес. Этот адрес обрезается до типа int. Полная бессмыслица. Ошибок может быть очень много.
сначала спрашивайте размер scanf , потом выделяйте память.