DOCUMENT:Q43703 29-NOV-2001 [visualc] TITLE :INFO: Casting a Pointer to Type Equivalent to Multidimensional PRODUCT :Microsoft C Compiler PROD/VER::1.0,1.5,1.51,1.52,2.0,2.1,4.0,5.0,6.0 OPER/SYS: KEYWORDS:kbLangC kbVC100 kbVC150 kbVC151 kbVC152 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600 ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft C for MS-DOS - Microsoft C/C++ for MS-DOS - Microsoft Visual C++, versions 1.0, 1.5, 1.51, 1.52, 2.0, 2.1, 4.0 - Microsoft Visual C++, 32-bit Enterprise Edition, versions 5.0, 6.0 - Microsoft Visual C++, 32-bit Professional Edition, versions 5.0, 6.0 - Microsoft Visual C++, 32-bit Learning Edition, version 6.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 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' ; Additional query words: ====================================================================== Keywords : kbLangC kbVC100 kbVC150 kbVC151 kbVC152 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600 Technology : kbVCsearch kbVC400 kbAudDeveloper kbZNotKeyword8 kbvc150 kbvc100 kbCCompSearch kbZNotKeyword3 kbVC500 kbVC600 kbVC151 kbVC200 kbVC210 kbVC32bitSearch kbVC152 kbVC500Search Version : :1.0,1.5,1.51,1.52,2.0,2.1,4.0,5.0,6.0 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. Copyright Microsoft Corporation 2001.