You are here: Home / Past Courses / Spring 2017 - ECPE 170 / Labs / Dynamic Memory 2D Array

Dynamic Memory 2D Array

A demo program that uses dynamic memory allocation. It can be compiled and run with this command: gcc dynamic_2d_array.c -std=c99 -o dynamic_2d_array

C source code icon dynamic_2d_array.c — C source code, 1 KB (1797 bytes)

File contents

// Multi-dimensional array code based on FAQ at:
// http://c-faq.com/aryptr/dynmuldimary.html

#include <stdio.h>   // Allows printf, ...
#include <string.h>
#include <stdlib.h>  // Allows malloc, ...
#include <errno.h>   // Allows errno

int** createArray(int rows, int cols);
void fillArray(int** myArray, int rows, int cols);
void printArray(int** myArray, int rows, int cols);
void deleteArray(int** myArray, int rows, int cols);

int main(void) {
  const int ROWS = 4;
  const int COLS = 8;
  int** myArray;
  
  myArray = createArray(ROWS, COLS);
  fillArray(myArray, ROWS, COLS);
  printArray(myArray, ROWS, COLS);
  deleteArray(myArray, ROWS, COLS);
  
  return EXIT_SUCCESS;
}

int** createArray(int rows, int cols) {
  int **myArray;
  
  // Allocate a 1xROWS array to hold pointers to more arrays
  myArray = calloc(rows, sizeof(int *));
  if (myArray == NULL) {
    printf("FATAL ERROR: out of memory: %s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }
  
  // Allocate each row in that column
  for (int i = 0; i < rows; i++) {
    myArray[i] = calloc(cols, sizeof(int));
    if (myArray[i] == NULL) {
      printf("FATAL ERROR: out of memory: %s\n", strerror(errno));
      exit(EXIT_FAILURE);
    }
  }
  
  return myArray;
}

void fillArray(int** myArray, int rows, int cols) {
  int count = 1;
  
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      myArray[i][j] = count;
      count++;
    }
  }
  
  return;
}

void printArray(int** myArray, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      printf("%i ", myArray[i][j]);
    }
    printf("\n");
  }
}

void deleteArray(int** myArray, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    free(myArray[i]);
  }
  free(myArray);
  
  return;
}