如何分配结构体?当我尝试打印struct和&struct的地址时,它给了我差值。所以这个结构体在存储变量之前需要一些字节来存储一些东西?
这是我的代码。
#include <stdio.h>
typedef struct Point {
int x;
struct Point* net;
} Point;
int main()
{
Point next;
printf("1: %x \n", next);
printf("2: %x \n", &next);
return 0;
}
这就是结果。
1: 5ffe80
2: 5ffe90
2条答案
按热度按时间gudnpqoy1#
您的代码在两种情况下都有未定义的行为:
printf("1: %x \n", next);
中,你传递了一个结构,其中printf
需要一个unsigned int
:这具有未定义的行为。printf("1: %x \n", &next);
中,你传递了一个指向结构的指针,其中printf
需要一个unsigned int
。同样的问题。你观察到不同的行为,但任何事情都可能发生。
要打印指针的值,请使用以下命令:
当你通过值传递结构时,你不能打印任何东西,因为
printf
不处理这种数据类型。结构由编译器实现为具有指定内容的
sizeof(Point)
字节块。取决于上下文,这些块可以位于堆栈的区域中,或者存储在多个寄存器中的一个中。如果使用malloc()
分配内存,则返回地址的块将保证具有存储任何对象类型(包括所有结构)所需的对齐。2vuwiymt2#
这是Undefined Behaviour,因为
printf()
假设您作为第二个参数传递。这会导致将您传递的整个结构解释为unsigned
,这不是真的,但允许(您可能会收到编译警告),因为printf是va_args
函数,其中编译器无法决定参数列表类型,因为它们是通过扫描格式字符串的字符在内部决定为printf()
的。这也是Undefined Behaviour,但原因不同:你正在向函数传递一个指针,其中包含
Point
结构的地址,这将被解释为unsigned
,以十六进制打印它的值。您应该使用%p
来打印指针值,并且它应该是正确的。但是在第一种情况下,你总是将复制到函数中的整个结构传递,而printf
解释这些数据,就像你只传递了一个unsigned
一样。这可能导致任何事情