Click here to Skip to main content
Click here to Skip to main content
Technical Blog

Tagged as

Dynamic Three Dimensional Arrays in C\C++\C#\Java

, 24 May 2010 CPOL
Rate this:
Please Sign up or sign in to vote.
Implementing a three dimensional array dynamically in C, C++, C# and Java

If you come from a Java or C# perspective and want to create a multi-dimensional array in C or C++, you'll soon figure out that multi-dimensional array allocation in C\C++ is not as simple, plus you'll have to worry about deallocation since there is no garbage collector to do the work for you. Below, I'll show four different sample codes showing how to work with a three dimensional array in Java, C#, C++ and C, respectively.

Java 3D Array

In Java, creating a 3-dimensional array is as simple as saying:

int[][][] array3D = new int[x][y][z];

You can then access the elements of the 3-dimensional array at array3D[i][j][k].

Sample Code

public static void main(String[] args)
{
    //  Array 3 Dimensions
    int x = 4, y = 5, z = 6;

    //  Array Iterators
    int i, j, k;

    //  Allocate 3D Array
    int[][][] array3D = new int[x][y][z];

    //  Access array elements
    for (i = 0; i < x; i++)
    {
        System.out.println(i);

        for (j = 0; j < y; j++)
        {
            System.out.println();

            for (k = 0; k < z; k++)
            {
                array3D[i][j][k] = (i * y * z) + (j * z) + k;
                System.out.print("\t" + array3D[i][j][k]);
            }
        }

        System.out.println('\n');
    }
}

C# 3D Array

In C#, the concept is almost the same as in Java. However, C# makes the distinction between jagged and multi-dimensional arrays. Elements of a multi-dimensional array are stored in a contiguous block in memory while elements of a jagged array are not. Java arrays are actually jagged arrays, while C# supports both and allows you to choose which one you want based on the syntax of your code. Note that multi-dimensional arrays are better (in most cases) than jagged arrays, and that is considered a minus point for Java.

Using jagged arrays in C# is not as simple as in Java. It’s almost like the way we would implement it in C++.

int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[4];
jaggedArray[1] = new int[3];

However, multi-dimensional arrays in C# are very simply to use. You can create a 3 dimensional array as follows:

int[,,] array3D = new int[x, y, z];

then access its elements at array3D[i][j][k].

Sample Code

static void Main(string[] args)
{
    //  Array 3 Dimensions
    int x = 4, y = 5, z = 6;

    //  Array Iterators
    int i, j, k;

    //  Allocate 3D Array
    int[,,] array3D = new int[x, y, z];

    //  Access array elements
    for (i = 0; i < x; i++)
    {
        Console.WriteLine(i);

        for (j = 0; j < y; j++)
        {
            Console.WriteLine();

            for (k = 0; k < z; k++)
            {
                array3D[i, j, k] = (i * y * z) + (j * z) + k;
                Console.Write("\t{0}", array3D[i, j, k]);
            }
        }

        Console.WriteLine('\n');
    }
}

C++ 3D Array

To create a multi-dimensional array in C++, we should change perspective a little bit and think of creating arrays that point to other arrays, which point to other arrays, and so on. For example, to create a 2x3x4 array in C++, we should imagine the implementation as follows:

For simplicity, we are doing the jagged implementation of the multi-dimensional array (address of array3d[0][1][0] is not directly after array3d[0][0][3] in memory representation above). In the next section, we will implement it in C the contiguous way. To allocate a jagged 2D array in C++, one can write the following (compare to C# jagged above):

int** jaggedArray = new int*[2];
jaggedArray[0] = new int[4];
jaggedArray[1] = new int[3];

The elements can be accessed as usual: jaggedArray[i][j]. The extra work we have to do in C++ is to explicitly deallocate the array.

delete[] jaggedArray[0];
delete[] jaggedArray[1];
delete[] jaggedArray;

See the code sample below to understand how we allocate and deallocate a 3 dimensional array in C++.

Sample Code

#include <span class="code-keyword"><iostream>
</span>

using namespace std;

void main()
{
    //  Array 3 Dimensions
    int x = 4, y = 5, z = 6;

    //  Array Iterators
    int i, j, k;

    //  Allocate 3D Array
    int ***array3D = new int**[x];

    for(i = 0; i < x; i++)
    {
        array3D[i] = new int*[y];

        for(j = 0; j < y; j++)
        {
            array3D[i][j] = new int[z];
        }
    }

    //  Access array elements
    for(i = 0; i < x; i++)
    {
        cout << i << endl;

        for(j = 0; j < y; j++)
        {
            cout << endl;

            for(k = 0; k < z; k++)
            {
                array3D[i][j][k] = (i * y * z) + (j * z) + k;
                cout << '\t' << array3D[i][j][k];
            }
        }

        cout << endl << endl;
    }

    //  Deallocate 3D array
    for(i = 0; i < x; i++)
    {
        for(j = 0; j < y; j++)
        {
            delete[] array3D[i][j];
        }

        delete[] array3D[i];
    }
    delete[] array3D;
}

C 3D Array

Implementing multi-dimensional arrays in C is very similar to C++, except that we use malloc()\free()  stdlib methods instead of the new\delete keywords. The memory representation below is the same, but we are going to focus in this section on making the elements of the 3 dimensional array contiguous.

To do so, we start by allocating space for all array elements in one call to malloc.

int *allElements = malloc(x * y * z * sizeof(int));

Next, we create the arrays of pointers, and point to the contiguous elements we’ve already allocated.

int ***array3D = malloc(x * sizeof(int **));
for(i = 0; i < x; i++)
{
    array3D[i] = malloc(y * sizeof(int *));

    for(j = 0; j < y; j++)
    {
        array3D[i][j] = allElements + (i * y * z) + (j * z);
    }
}

Note that if we wanted the same jagged implementation as in the C++ example above, we could ignore the allocation of allElements and change the line of code array3D[i][j] = allElements + (i * y * z) + (j * z); to array3D[i][j] = malloc(z * sizeof(int)). Below is a sample code for allocating, accessing and deallocating a 3 dimensional array in C.

#include <span class="code-keyword"><stdio.h>
</span>
#include <span class="code-keyword"><stdlib.h>
</span>

void main()
{
    //  Array 3 Dimensions
    int x = 4, y = 5, z = 6;

    //  Array Iterators
    int i, j, k;

    //  Allocate 3D Array
    int *allElements = malloc(x * y * z * sizeof(int));
    int ***array3D = malloc(x * sizeof(int **));

    for(i = 0; i < x; i++)
    {
        array3D[i] = malloc(y * sizeof(int *));

        for(j = 0; j < y; j++)
        {
            array3D[i][j] = allElements + (i * y * z) + (j * z);
        }
    }

    //  Access array elements
    for(i = 0; i < x; i++)
    {
        printf("%d\n", i);

        for(j = 0; j < y; j++)
        {
            printf("\n");

            for(k = 0; k < z; k++)
            {
                array3D[i][j][k] = (i * y * z) + (j * z) + k;
                printf("\t%d", array3D[i][j][k]);
            }
        }

        printf("\n\n");
    }

    //  Deallocate 3D array
    free(allElements);
    for(i = 0; i < x; i++)
    {
        free(array3D[i]);
    }
    free (array3D);
}

Source Code

Full source code for the above 4 samples is available here.


Filed under: C, CPP, csharp, Java Tagged: 3d, array, jagged, Multi-dimensional, Multidimensional Array

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Ali BaderEddin
Software Developer Microsoft
United States United States
http://mycodelog.com/about/

Comments and Discussions

 
GeneralSmall typo PinmemberYusuf27-May-10 10:21 
GeneralRe: Small typo PinmemberAli BaderEddin27-May-10 13:31 
GeneralRe: Small typo PinmemberYusuf1-Jun-10 9:01 
GeneralRe: Small typo PinmemberAli BaderEddin2-Jun-10 11:27 
GeneralRe: Small typo PinmemberYusuf3-Jun-10 5:33 
GeneralMy vote of 2 PinmemberKjell Elster25-May-10 1:39 
GeneralRe: My vote of 2 PinmemberAescleal25-May-10 1:43 
GeneralMy vote of 2 PinmemberDanny Ruijters25-May-10 0:49 
GeneralPlaying with arrays and pointers is dangerous... PinmemberAescleal24-May-10 23:42 
GeneralUse the Standard Library and Boost in C++ PinmemberJon Summers24-May-10 22:14 
GeneralGreat article for novices of C/C++ PinmemberS.H.Bouwhuis24-May-10 21:23 
GeneralRe: Great article for novices of C/C++ Pinmembershoorik24-May-10 22:28 
GeneralRe: Great article for novices of C/C++ PinmemberS.H.Bouwhuis24-May-10 22:37 
GeneralRe: Great article for novices of C/C++ Pinmembershoorik24-May-10 22:45 
GeneralRe: Great article for novices of C/C++ PinmemberS.H.Bouwhuis24-May-10 22:53 
GeneralRe: Great article for novices of C/C++ Pinmembershoorik24-May-10 23:23 
GeneralRe: Great article for novices of C/C++ PinmemberS.H.Bouwhuis24-May-10 23:41 
GeneralRe: Great article for novices of C/C++ Pinmembershoorik24-May-10 23:50 
GeneralRe: Great article for novices of C/C++ PinmemberGeorge L. Jackson25-May-10 1:38 
GeneralRe: Great article for novices of C/C++ Pinmembershoorik25-May-10 1:47 
GeneralRe: Great article for novices of C/C++ PinmemberArmel Asselin31-May-10 10:32 
GeneralRe: Great article for novices of C/C++ PinmemberAescleal24-May-10 23:52 
GeneralRe: Great article for novices of C/C++ Pinmembershoorik25-May-10 1:50 
GeneralRe: Great article for novices of C/C++ PinmemberArman Z. Sahakyan25-May-10 16:39 
GeneralRe: Great article for novices of C/C++ PinmemberAescleal25-May-10 21:00 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.141220.1 | Last Updated 25 May 2010
Article Copyright 2010 by Ali BaderEddin
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid