好的,目前我正在为我的简历写一个内核。在编写我的内存管理单元时,我遇到了一堵砖墙。
int address = (int)malloc(sizeof(Test))
consoleWriteString("Variable Address:\n");
consoleWriteInteger(address);
char* f = (void*)address;
consoleWriteString("\nVariable Address:\n");
consoleWriteInteger((int)&f); // Should print off the same as above
逻辑上两者的输出应该相同。某处某事已经出了问题。因为我的输出如下。
Variable Address: 47167
Variable Address: 1065908
经过长时间的测试和调试后,我终于放弃并决定要求堆栈溢出。此外,如果您发现任何语法错误忽略它们。顺便说一下,这一切都在C中,并且所有函数都是自定义的,包括malloc,但我已经确定错误不在于该功能,或任何其他事实。我相信这只是我对指针和演员的愚蠢,但是当我错过了一些非常简单的事情时,不要嘲笑我。
谢谢yall
答案 0 :(得分:2)
&f
是f
的地址,而不是其中包含的地址! f
在堆栈中。它的值(您首次打印的地址)指向已分配的内存。
以这种方式思考:你在内存中为某些东西分配空间。该存储区域具有地址。您将地址放在指针(f
)中,以便指向该区域。但是f
本身需要在内存中的某个位置才能保存该地址的值。在这种情况下,f
位于堆栈中,&f
获取f
(原始地址的容器)的地址,而不是f
包含的地址。< / p>
顺便说一句,要非常小心地将地址转换为int
(并返回!),因为int
可能不足以保存地址(例如,在x86-64上,具体取决于您的编译器) )。我相信当您想要将地址用作整数时使用的正确类型是uintptr_t
中的stdint.h
。
答案 1 :(得分:1)
f的值(恰好是指针)与address
(它也是指针,但属于不同类型)相同 - 这就是你要做的在行
char* f = (void*)address;
然后你打印f:
的地址consoleWriteInteger((int)&f);
这与f的值不一样......将该行更改为
consoleWriteInteger((int)f);
你应该全力以赴。
答案 2 :(得分:0)
第一个print out是一个int,虽然malloc返回一个地址,第二个是一个转换为int的地址。而f
代替&
获取值的地址,而*
取消引用指针,获取指向的值。