INFO: Casting a Pointer to Type Equivalent to Multidimensional

Last reviewed: September 2, 1997
Article ID: Q43703

The information in this article applies to:
  • Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, 6.0ax
  • Microsoft C/C++ for MS-DOS, version 7.0
  • Microsoft Visual C++ for Windows, versions 1.0, 1.5, 1.51, 1.52
  • Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 2.1, 4.0, 5.0

SUMMARY

In some situations you may need to cast a pointer or an address to a type that is equivalent to a multidimensional array. The following example demonstrates such a situation:

   typedef char Arr2Dim [][20] ;
   void myfunc (Arr2Dim) ;
   char * ptr ;
   ...
   void main (void)
   {
       ...
       myfunc ( (Arr2Dim) ptr ) ;  /* illegal */
       ...
   }

Casting the variable "ptr" to the array type "Arr2Dim" is not correct. The Microsoft C Compiler displays the following error message:

   error C2067: cast to array type is illegal

The correct procedure is to cast the pointer "ptr" to a pointer type equivalent to the array type Arr2Dim. This pointer type can be defined as follows:

   typedef char (*Ptr2Dim) [20] ;

Casting "ptr" to the type of "Ptr2Dim", as follows, is correct and produces no warning messages when compiled at warning level 3:

   myfunc ( (Ptr2Dim) ptr ) ;

The address (or pointer) passed to the function is used correctly.

MORE INFORMATION

A similar solution may be applied to the problem of dynamically allocating a multidimensional array. For example, the following code fragment allocates a memory block, which can be used as a 10 x 20 x 30 three- dimensional array:

   #include <malloc.h>

   typedef char (*Ptr3Dim) [20][30] ;
   Ptr3Dim ptr3arr ;
   ...
   void main (void)
   {
       ...
       ptr3arr = (Ptr3Dim) malloc (10 * sizeof(char) * 20 * 30) ;
       ...
   }

After the allocation, "ptr3arr" can be used as a three-dimensional array, as follows, provided i, j, and k are integers within the proper range:

   ptr3arr [i][j][k] = 'a' ;
Keywords          : CLngIss kbfasttip
Version           : MS-DOS:6.0,6.00a,6.00ax,7.0; WINDOWS:1.0,1.5,1.51,1.52;  WINDOWS NT:1.0,2.0,2.1,4.0,5.0
Platform          : MS-DOS NT WINDOWS
Issue type        : kbinfo


================================================================================


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 2, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.