我还有另一个新手问题: 为什么结构的第一个成员在未初始化时返回的地址与结构自己的指针地址不相似?
示例:
struct Metadata {
int message_ID;
//other members...
//...
};
struct Metadata* baseMetadataPtr = (struct Metadata*) malloc(sizeof(struct Metadata)*100);
printf("baseMetadataPtr: %d\n", baseMetadataPtr);
//consoll says "baseMetadataPtr: 2636496"
printf("baseMetadataPtr->message_ID: %d\n", baseMetadataPtr->message_ID);
//consoll says "baseMetadataPtr->message_ID: 2621636"
答案 0 :(得分:8)
您的第二次printf
电话是错误的。它应该是:
printf("baseMetadataPtr->message_ID: %p\n", &baseMetadataPtr->message_ID);
// need to use %p for pointer ^ ^ need unary-& operator
正如现在所写,正在打印message_ID
的整数值。您需要获取baseMetadataPtr->message_ID
的地址。另请注意,如果要打印指针,则应使用%p
格式说明符,而不是%d
(打印整数)。
struct-type对象的第一个数据成员的地址始终与struct-type对象本身的地址相同。这是有保证的,因为在结构的开头不允许填充(尽管在数据元素之间或结构的末尾允许填充)。
答案 1 :(得分:1)
我喜欢画画。他们帮我“看”东西
struct Metadata *baseMetadataPtr;
baseMetadataPtr = malloc(100 * sizeof *baseMetadataPtr);
有了它,并假设一个线性记忆(下面的方框),并忽略了不同对象的空间要求,我们有
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|... ^^^^^^^ baseMetadataPtr (of type (struct Metadata *)) ******* ===========================> |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|... ^^^^^^^ baseMetadataPtr ^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^ ^^ ... (of type (struct Metadata *)) *baseMetadataPtr (struct Metadata) *(baseMetadataPtr+1) baseMetadataPtr[2]
然后,放大左侧的部分
*baseMetadataPtr |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|... ^^^ Message_ID (type (int)) ^^^^^^^ Message_Len (type (size_t)) ^^^^ ... other members, followed by another object of type (struct Metadata)
答案 2 :(得分:0)
这将打印指针的内存地址:
printf("baseMetadataPtr: %d\n", baseMetadataPtr);
,这将在struct中打印变量的内存地址:
printf("baseMetadataPtr->message_ID: %d\n", &baseMetadataPtr->message_ID);
这就是为什么他们不是邻居。
答案 3 :(得分:0)
baseMetadataPtr->message_ID
打印变量message_ID
的值。由于你还没有初始化它,它包含垃圾。要打印其地址,您需要执行&baseMetadataPtr->message_ID
。此外,您需要使用格式说明符%p
来打印指针值。
答案 4 :(得分:0)
第一个printf()打印指针的当前值IE,它指向的是什么地址。
第二个printf打印元数据成员message_ID的值。
要获得所需内容,请尝试:printf(“baseMetadataPtr-> message_ID:%d \ n”,& baseMetadataPtr-> message_ID);