Debugging Address Printing Oddity
In a C program involving a class with int, char, and string data members, printing their addresses raises an eyebrow. When accessing the char member, the output mysteriously remains blank. Additionally, casting a public char member to a void pointer reveals an offset of 8, prompting further investigation.
Missing Char Address:
The issue with the blank char address output stems from the way the & operator is interpreted. By default, using & on a char variable returns a pointer to a C-style string (char). This causes the overloaded << operator for string streams to treat the variable as an array of characters and print them as a string, rather than its address.
Resolving the Issue:
To print the address of the char member correctly, an explicit cast to void* is required. This cast indicates that the pointer should be treated as a generic pointer, preventing the << operator from interpreting it as a C string. The corrected code:
cout << "address of char :" << (void*) &b << endl;
Alternatively, using static_cast is a safer and preferred method for casting pointers in modern C :
cout << "address of char :" << static_cast( &b ) << endl; Offset of 8 in Public Members:
When the int, char, and string members are public, the offset between the addresses of the char and string members is always 8. This is because in a public class, member variables are laid out within the class structure in the order they are declared. Therefore, the string member follows the char member at a fixed offset of 8 bytes.
The above is the detailed content of Why Does My C Char Member's Address Print Blank, and Why Is There an 8-Byte Offset?. For more information, please follow other related articles on the PHP Chinese website!