Microsoft KB Archive/43703

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Knowledge Base


INFO: Casting a Pointer to Type Equivalent to Multidimensional

Article ID: 43703

Article Last Modified on 7/5/2005



APPLIES TO

  • Microsoft C Professional Development System 6.0a
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Standard Edition



This article was previously published under Q43703


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: kbinfo kblangc KB43703