0

好的,目前我正在为简历编写内核。在编写我的内存管理单元时,我碰到了一堵砖墙。

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,但我已经确定错误不在于该函数或任何其他事实。我相信这只是我对指针和施法的愚蠢,但是当我错过了一些超级简单的事情时不要嘲笑我。

谢谢你们

4

3 回答 3

2

&f是 的地址f,而不是其中包含的地址!f在堆栈上。它的值(你第一次打印的地址)指向分配的内存。

这样想:你在内存中为一些东西分配空间。这个内存区域有一个地址。您将地址放入指针 ( f) 中,使其指向该区域。但f它本身需要位于内存中的某个位置才能保存该地址的值。在这种情况下,f是在堆栈上,并&f获取f(原始地址的容器)的地址,而不是f包含的地址。

顺便说一句,要非常小心地将地址转换为int(并返回!),因为int可能不足以容纳地址(例如,在 x86-64 上,取决于您的编译器)。我相信当您想将地址用作整数时使用的正确类型是uintptr_tin stdint.h

于 2013-05-31T04:00:14.020 回答
1

f的(恰好是一个指针)与address(它也是一个指针,但类型不同)相同 - 这就是您在该行中所做的

char* f = (void*)address;

但是你打印 f 的地址

consoleWriteInteger((int)&f);

这与 f 的不同...将那行更改为

consoleWriteInteger((int)f);

你应该准备好了。

于 2013-05-31T03:59:59.403 回答
0

第一个打印输出是一个 int,虽然 malloc 返回一个地址,第二个是一个转换为 int 的地址。dof取而代之&的是让你得到一个值的地址,而*取消引用一个让你得到指向的值的指针。

于 2013-05-31T04:00:27.117 回答