2017-04-26 4 views
0
#include <stdio.h> 
#include <stdlib.h> 

void printingArr(int** arr, int rows); 
void sortingEachOneOfThem(int** pArr, int rows); 
void sortingTheWholeArray(int** pArr, int rows); 
void bubbleSort(int* arr); 
void freeArray(int **a, int m); 

int main(void) 
{ 
    int** pArr = 0; 
    int numOfRows = 0; 
    int sizes = 0; 
    printf("Enter number of rows: "); 
    scanf("%d", &numOfRows); 
    pArr = (int**) malloc(sizeof(int*) * numOfRows); 
    if (pArr == NULL) 
    { 
     printf("Unsuccessful malloc!\n"); 
     return 1; 
    } 

    for (int i = 0; i < numOfRows; i++) 
    { 
     printf("Enter array length for row %d: ",i); 
     scanf("%d", &sizes); 
     pArr[i] = (int*) malloc(sizeof(int) * sizes + 1); 
     if (pArr[i] == NULL) 
     { 
      printf("Unsuccessful malloc!\n"); 
      return 1; 
     } 
     pArr[i][0] = sizes; 
     for (int k = 1; k < sizes + 1; k++) 
     { 
      printf("Enter value for array: "); 
      scanf("%d", &pArr[i][k]); 
     } 
    } 
    printingArr(pArr, numOfRows); 
    sortingEachOneOfThem(pArr, numOfRows); 
    printingArr(pArr, numOfRows); 
    sortingTheWholeArray(pArr, numOfRows); 
    printingArr(pArr, numOfRows); 


    for (int i = 0; i < numOfRows; i++) 
    { 
     if (pArr[i] != NULL) 
     { 
      free(*(pArr + i)); 
     } 
    } 
    //free(pArr); 

    system("pause"); 
    return 0; 
} 
/* 
this amazing, wonderfull piece of program prints the array given 
input: int** arr, int rows 
output: none 
*/ 
void printingArr(int** arr, int rows) 
{ 
    int i = 0; 
    int k = 0; 
    for (i = 0; i < rows; i++) 
    { 
     for (k = 0; k <= arr[i][0]; k++) 
     { 
      printf("%d ", arr[i][k]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
} 
/* 
This beautiful function sorts the whole array, but its length of rows like a pyramid 
input: int** arr, int rows 
output: none 
*/ 
void sortingTheWholeArray(int** pArr, int rows) 
{ 
    int* temp = 0; 
    int i = 0, k = 0; 
    for (i = 0; i < rows - 1; i++) 
    { 
     for (k = 0; k < rows - 1; k++) 
     { 
      if (pArr[k][0] > pArr[k + 1][0]) 
      { 
       temp = pArr[k]; 
       pArr[k] = pArr[k + 1]; 
       pArr[k + 1] = temp; 
      } 
     } 
    } 
} 
/* 
This little small function sorts every row of the array of arrays given to it 
input: int** arr, int rows 
output: none 
*/ 

void sortingEachOneOfThem(int** pArr, int rows) 
{ 
    int i = 0; 
    for (i = 0; i < rows; i++) 
    { 
     bubbleSort(pArr[i]); 
    } 
} 

/* 
This little piece of a code is a bubble sort, sorts the array given to it :) 
input: int* arr, int rows 
output: none 
*/ 

void bubbleSort(int* arr) 
{ 
    int i = 1, k = 0; 
    for (i = 1; i < arr[0] - 1; i++) 
    { 
     for (k = 1; k <= arr[0] - i; k++) 
     { 
      if (arr[k] > arr[k + 1]) 
      { 
       arr[k] += arr[k + 1]; 
       arr[k + 1] = arr[k] - arr[k + 1]; 
       arr[k] -= arr[k + 1]; 
      } 
     } 
    } 
} 

die frei am Ende meines Code abstürzt, diesen Fehler zeigt: https://i.stack.imgur.com/nqxBG.png die gleiche Nutzung der Funktion free() auf einem anderen Code gut gearbeitet, aber nicht hier. Ich habe versucht, es im Schritt für Schritt Modus durchlaufen, es stürzt bei der ersten frei. Dr. Memory zeigt dies: https://i.stack.imgur.com/rSZJr.png ein anderer Link: https: // i.stack. imgur.com/ZX2Ne.png (fügen Sie es ohne die Leerzeichen in der Mitte ein, kann nicht mehr als 2 Links posten) was kann ich tun?free() stürzt den Code

+3

Veröffentlichen Sie Text als Text selbst, nicht als Bild. –

+0

Verwenden Sie 2D-Arrays anstelle von Pointer-Arrays und alle diese Bugs verschwinden automatisch. Es gibt keine Notwendigkeit, hier ein Array von Zeigern zu verwenden. – Lundin

Antwort

4

Dies:

pArr[i] = (int*) malloc(sizeof(int) * sizes + 1); 

Unter zuordnet. Das Hinzufügen eines einzelnen Bytes zur Größe eines Arrays von int macht wenig Sinn. Sie haben wahrscheinlich gedacht:

pArr[i] = malloc((sizes + 1) * sizeof *pArri[i]); 

Sie den Rückgabewert von malloc() nicht gegossen und sizeof auf der linken Seite verwenden.

+0

Danke, es hat funktioniert. aber warum sollte ich nicht den Rückgabewert von malloc() werfen? Unser Lehrer hat uns gesagt, dass es eine Konvention ist. – Lidor

+0

@Lidor Sie können [diese Antwort] (http://stackoverflow.com/a/605858/28169) aus den Gründen sehen. Wenn das deine Konvention ist, denke ich, dass du das tun musst, aber ich kann das nicht wissen, wenn du deinen Code postest. :) Außerdem würde ich sagen, dass es eine schlechte Konvention ist und geändert werden sollte, aus den Gründen, die in der verknüpften Antwort angegeben sind. – unwind