所以,我有这个简单的代码初始化用户的整数矩阵,并以各种方式对数组进行排序并使用动态内存。
#include <stdio.h>
#include <stdlib.h>
void initArrays();
void printArr(int** matrix, int rows);
void sortArr(int** matrix,int rows);
void printByOrder(int** matrix,int rows);
int main(void)
{
initArrays();
system("Pause");
return 0;
}
void initArrays()
{
int i = 0;
int j = 0;
int * arr = 0;
int len = 0;
int** matrix = 0;
int rows = 0;
printf("Enter number of rows: ");
scanf("%d", &rows);
matrix = (int**)malloc(rows * sizeof(int));
for (i = 0; i < rows; i++)
{
printf("Enter array length for row %d: ", i);
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int));
arr[0] = len;
for (j = 0; j < len; j++)
{
printf("Enter value for array: ");
scanf("%d",arr + j + 1);
}
matrix[i] = arr;
}
printArr(matrix, rows);
sortArr(matrix,rows);
printByOrder(matrix, rows);
free(matrix);
free(arr);
}
void printArr(int** matrix, int rows)
{
int i = 0;
int j = 0;
printf("Printing:\n");
for (i = 0; i < rows; i++)
{
for (j = 0; j <= matrix[i][0];j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
void sortArr(int ** matrix, int rows)
{
int i = 0;
int j = 0;
int k = 0;
int* arr = 0;
int pos = 0;
int swap = 0;
for (i = 0; i < rows; i++) //getting a single arr to work with.
{
arr = matrix[i];
for (j = 1; j < arr[0]; j++)
{
pos = j;
for (k = j + 1; k <= arr[0]; k++) //selection sort.
{
if (arr[pos] > arr[k])
{
pos = k;
}
}
if (pos != j)
{
swap = arr[j];
arr[j] = arr[pos];
arr[pos] = swap;
}
}
}
matrix[i] = arr;
printf("Sorted Rows: \n");
for (i = 0; i < rows; i++)
{
for (j = 1; j < matrix[i][0] + 1; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
void printByOrder(int** matrix, int rows)
{
int i = 0;
int j = 0;
int smallest = 0;
int pos = 0;
int* swap = 0;
for (j = 0; j < rows - 1; j++)
{
pos = j;
for (i = j + 1; i < rows; i++) //selection sort.
{
if (matrix[pos][0] > matrix[i][0])
{
pos = i;
}
}
if (pos != j)
{
swap = matrix[j];
matrix[j] = matrix[pos];
matrix[pos] = swap;
}
}
printf("Ordered Array: \n");
for(i = 0; i < rows; i++)
{
for (j = 1; j < matrix[i][0] + 1; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
我唯一的问题是,当free
函数进入时,程序崩溃并出现错误&#34;正常块#63&#34后检测到堆损坏。我尝试运行没有{的程序{1}}它工作得很好。
我试着四处寻找,我无法找到为什么这个错误发生在我身上。有谁可以向我解释一下?
谢谢!
答案 0 :(得分:2)
Valgrind(见http://valgrind.org/)显示了你的问题:
scanf("%d",arr + j + 1);
线。
如果您想将长度保持在第一个位置,您的分配大小:
arr = (int*)malloc(len * sizeof(int));
太小(你需要再长一int
个。)
答案 1 :(得分:1)
如果您要释放一个类似于您创建的临时矩阵,则迭代指向数组并释放每个指针,然后释放主指针。不要释放arr
,因为它指向最后创建的数组。像这样的东西应该很适合你:
for (size_t i = 0; i < rows; ++i)
{
free(matrix[i]);
}
free(matrix);