INFO: A Case Where BUFF[] and *BUFF Are Different (38024)



The information in this article applies to:

  • Microsoft C for MS-DOS
  • Microsoft Visual C++ for Windows, 16-bit edition 1.0
  • Microsoft Visual C++ for Windows, 16-bit edition 1.5
  • Microsoft Visual C++, 32-bit Editions 1.0
  • Microsoft Visual C++, 32-bit Editions 2.0
  • Microsoft Visual C++, 32-bit Editions 2.1
  • Microsoft Visual C++, 32-bit Editions 4.0
  • Microsoft Visual C++, 32-bit Editions 5.0
  • Microsoft Visual C++, 32-bit Editions 6.0
  • Microsoft Visual C++ .NET (2002)
  • Microsoft Visual C++ .NET (2003)

This article was previously published under Q38024
NOTE: Microsoft Visual C++ NET (2002) supported both the managed code model that is provided by the .NET Framework and the unmanaged native Windows code model. The information in this article applies to unmanaged Visual C++ code only.

SUMMARY

When the variable buff has been declared in an assembly-language program, such as the following:
        .data
        public buff
_buff   db 200 dup (0xab)
        .data ends
				
there is a difference between the two following C declarations:
   extern unsigned char buff[];

   extern unsigned *buff;
				
The difference is that the first declaration says there is a block of memory that is named buff; the second says there is something called buff that is a pointer.

This difference can be seen by referencing buff as follows:
   buff[x]
				
If buff is declared as an array, the referencing is correct.

However, if buff is declared as a pointer, the referencing is incorrect. The data pointed to by buff (ab in this example) is translated into a memory address, then x bytes are added to it generating an incorrect reference.

For additional information, click the article number below to view the article in the Microsoft Knowledge Base:

44463 Difference Between Arrays and Pointers in C


Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbinfo kbLangC KB38024