我是一个完全不懂C语言的新手,所以这可能是一个愚蠢的问题,请注意!
这是受学习《Learn C the Hard Way》中“练习16”额外加分部分的启发,如果任何人想了解上下文。
假设有以下导入:
这是受学习《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*)¢er);
&
,得到变量offCenter
的地址。 - Daniel Fischerprintf
的"%p"
格式需要一个void*
参数。如果你想打印其他类型指针的值,则应将其明确转换为void*
:printf("Location: %p\n", (void*)center);
或printf("Location: %p\n", (void*)¢er);
。在大多数系统上,即使没有强制转换,它也很可能能够正常工作(因为通常所有指针都具有相同的表示方式),但这不能保证。 - Keith Thompsonprintf
这样的可变参数函数,原型并不指定类型,因此需要进行强制转换。 - Keith Thompsonvoid*
不同(这很少但是合法),那么强制转换将使其正常工作而不是可能崩溃。"%p"
需要一个void*
类型的参数;传递任何其他类型的参数都会导致未定义行为。(几乎; 有一种特殊情况保证void*
与char*
,signed char*
和unsigned char*
具有相同的表示形式。) - Keith Thompson