我该如何在C语言中获取结构体的地址?

10
我是一个完全不懂C语言的新手,所以这可能是一个愚蠢的问题,请注意!
这是受学习《Learn C the Hard Way》中“练习16”额外加分部分的启发,如果任何人想了解上下文。
假设有以下导入:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

假设有这样一个简单的结构体:

struct Point {
    int x;
    int y;
};
如果我在堆上创建它的实例:
struct Point *center = malloc(sizeof(Point));
assert(center != NULL);
center->x = 0;
center->y = 0;

我知道可以像这样打印结构体在内存中的位置:

printf("Location: %p\n", (void*)center);

但如果我在堆栈上创建它会怎样呢?

struct Point offCenter = { 1, 1 };

堆栈中的值仍然在内存中具有位置,那么我如何获取该信息?我需要创建指向我的新堆栈结构的指针,然后使用它吗?

编辑:哎呀,看来这是一个显而易见的问题。感谢Daniel和Clifford!为了完整起见,这里是使用&打印示例:

printf("Location: %p\n", (void*)&center);

8
请使用取地址运算符&,得到变量offCenter的地址。 - Daniel Fischer
4
太晚了,没有复制的价值。 - Daniel Fischer
3
注意,printf"%p"格式需要一个void*参数。如果你想打印其他类型指针的值,则应将其明确转换为void*printf("Location: %p\n", (void*)center);printf("Location: %p\n", (void*)&center);。在大多数系统上,即使没有强制转换,它也很可能能够正常工作(因为通常所有指针都具有相同的表示方式),但这不能保证。 - Keith Thompson
1
@Clifford:如果编译器知道参数的类型,那么这是正确的。但对于像 printf 这样的可变参数函数,原型并不指定类型,因此需要进行强制转换。 - Keith Thompson
1
@Clifford:如果指针类型的表示方式与 void* 不同(这很少但是合法),那么强制转换将使其正常工作而不是可能崩溃。"%p" 需要一个 void* 类型的参数;传递任何其他类型的参数都会导致未定义行为。(几乎; 有一种特殊情况保证 void*char*signed char*unsigned char* 具有相同的表示形式。) - Keith Thompson
显示剩余13条评论
1个回答

13

使用一元运算符&获取变量的地址。

struct Point offCenter = { 1, 1 };
struct Point* offCentreAddress = &offCentre ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接