好的,目前我正在写一个内核,为了我的简历。在编写我的内存管理单元时,我遇到了瓶颈。
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&f
是f
的地址,而不是其中包含的地址!f
在堆叠上。它的值(您第一次打印的地址)指向已分配的内存。
这样想:你在内存中为一些东西分配了空间。这个内存区域有一个地址。您将地址放在一个指针(f
)中,以便它指向该区域。但是f
本身需要在内存中的某个位置来保存该地址的值。在这种情况下,f
在堆栈上,&f
获得f
(原始地址的容器)的地址,而不是f
包含的地址。
int
(和返回!),因为int
可能不足以容纳地址(例如在x86-64上,取决于您的编译器)。我认为,当您想使用地址作为整数时,正确的类型是stdint.h
中的uintptr_t
。
f(恰好是指针)的值与address
(也是指针,但类型不同)相同-这是您在
char* f = (void*)address;
然后打印f:
的地址consoleWriteInteger((int)&f);
这与f的值不一样…将该行改为
consoleWriteInteger((int)f);
你应该都准备好了
第一个输出是int型,尽管malloc返回的是一个地址,第二个是一个地址强制转换为int型。做f
代替&
给你一个值的地址,而*
解引用一个指针,让你得到什么是指向的值。