【问题标题】:Character Array Pointers and Casts from Integers (Memory Address)字符数组指针和整数转换(内存地址)
【发布时间】:2013-05-31 03:56:16
【问题描述】:

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

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

谢谢大家

【问题讨论】:

  • 分配指向整数的指针并使用强制转换使你的编译器静音?这就是灾难之路。为什么不使用void *addresschar *address?如果原因是没有consoleWritePointer,那就写一个!
  • 感谢您提供的信息,对于 consoleWritePointer,我将如何继续编写它?只需将其转换为十六进制地址,然后从那里打印?
  • 如果您已经有符合标准 C 的 printf,请使用 %p 说明符作为指针;如果不是,则将指针值转换为无符号整数值并打印(或使用联合,插入 ptr 并读取无符号值)。
  • 实际上我还没有标准的 printf,为了做到这一点,我需要进行字符串操作,这需要内存分配。这整个问题源于我试图测试我的 malloc,发现它有效,但是当我试图在一个地址创建一个 char 数组时,它会被搞砸。谢谢你告诉我如何打印它,每件事都有帮助!

标签: c pointers memory-management memory-address


【解决方案1】:

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

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

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

【讨论】:

  • 关于地址大小与int 大小的好建议!
  • 感谢您的帮助和快速响应,以及有关使用整数保存地址值的警告。
【解决方案2】:

f 的 (恰好是一个指针)与 address(也是一个指针,但类型不同)相同 - 这就是您在线

char* f = (void*)address;

然后你打印出 f:

地址
consoleWriteInteger((int)&f);

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

consoleWriteInteger((int)f);

你应该准备好了。

【讨论】:

    【解决方案3】:

    第一个打印输出是一个 int,虽然 malloc 返回一个地址,第二个是一个转换为 int 的地址。执行f 而不是& 获取值的地址,而* 取消引用指针,获取指向的值。

    【讨论】:

    • OP 不是要求所指向的值,而是地址。因此“使用*f”是错误的建议。如其他两个答案所述,“使用f 而不是&f”是正确的建议。
    • @Floris 我更改了它,但我不确定为什么它很重要,因为关于 OP 的所有内容都不正确,如果他不了解 malloc 的工作原理,不确定他为什么要编写内核
    • 我们有时都会得到一个短暂的“大脑放屁”——我们会盯着对其他人来说显而易见的东西。重要的是,我们尽量确保关于 SO 的答案是正确的(尽我们所能),即使这些问题让我们摸不着头脑。
    • 我了解 malloc 的工作原理,因为该代码中的代码是我编写的代码。 48小时不睡觉也有让我崩溃的倾向。这是我大学的期末考试周......
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多