当我打印struct和&struct的地址时有什么区别

tyu7yeag  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(117)

如何分配结构体?当我尝试打印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
gudnpqoy

gudnpqoy1#

您的代码在两种情况下都有未定义的行为:

  • printf("1: %x \n", next);中,你传递了一个结构,其中printf需要一个unsigned int:这具有未定义的行为。
  • printf("1: %x \n", &next);中,你传递了一个指向结构的指针,其中printf需要一个unsigned int。同样的问题。

你观察到不同的行为,但任何事情都可能发生。
要打印指针的值,请使用以下命令:

printf("1: %p\n", (void *)&next);

当你通过值传递结构时,你不能打印任何东西,因为printf不处理这种数据类型。
结构由编译器实现为具有指定内容的sizeof(Point)字节块。取决于上下文,这些块可以位于堆栈的区域中,或者存储在多个寄存器中的一个中。如果使用malloc()分配内存,则返回地址的块将保证具有存储任何对象类型(包括所有结构)所需的对齐。

2vuwiymt

2vuwiymt2#

printf("1: %x \n", next);

这是Undefined Behaviour,因为printf()假设您作为第二个参数传递。这会导致将您传递的整个结构解释为unsigned,这不是真的,但允许(您可能会收到编译警告),因为printf是va_args函数,其中编译器无法决定参数列表类型,因为它们是通过扫描格式字符串的字符在内部决定为printf()的。

printf("2: %x \n", &next);

这也是Undefined Behaviour,但原因不同:你正在向函数传递一个指针,其中包含Point结构的地址,这将被解释为unsigned,以十六进制打印它的值。您应该使用%p来打印指针值,并且它应该是正确的。但是在第一种情况下,你总是将复制到函数中的整个结构传递,而printf解释这些数据,就像你只传递了一个unsigned一样。这可能导致任何事情

相关问题