正常阻止#63

时间:2017-05-14 12:09:25

标签: c

所以,我有这个简单的代码初始化用户的整数矩阵,并以各种方式对数组进行排序并使用动态内存。

#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}}它工作得很好。 我试着四处寻找,我无法找到为什么这个错误发生在我身上。有谁可以向我解释一下? 谢谢!

2 个答案:

答案 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);