【问题标题】:Displacement with C pointers使用 C 指针进行位移
【发布时间】:2013-04-24 04:18:38
【问题描述】:

我希望在 C 程序中实现一个堆栈,我正在考虑使用 unsigned char * 作为基础。这将是堆栈的底部,所有其他寄存器和信息将是该地址的位移。但是,我似乎无法理解如何正确执行此操作。我正在考虑做这样的事情......

//Info: Store 20 at address x0000007c

unsigned char * base = 0;
int address = x0000007c;
(base + address) = 20;

C 编译器不喜欢这样,所以我想知道如何在不丢失指针的情况下解决这个问题或做类似的事情。

【问题讨论】:

  • 不确定我是否明白这个问题。您不能只将指针设置为您喜欢的某个值,然后离开。指针必须指向有效的东西。
  • 奇怪。您使用指针变量存储整数值,使用整数存储“地址”(实际上不是地址)。为什么?你在看哪本书?
  • @undefinedbehaviour 这是一个来自学校 C 教科书的 Y86 模拟器程序。此作业旨在教授获取和执行周期。
  • @MikeMelchione 这似乎是一本很差的教科书。
  • @undefinedbehaviour 它被称为计算机系统,程序员的视角。在我看来相当不错的书。

标签: c pointers memory-address


【解决方案1】:

编译器不喜欢你的代码,因为它在概念上是错误的; base + address 不是左值,即使它有错误的类型:你不能将 int 存储到 char* 中。但这在逻辑上是正确的:

 base[address] = 20;

或者,等价的,

 *(base + address) = 20;

虽然它在功能上不正确,因为 base 没有指向有效的内存。您需要分配堆栈,作为静态数组或通过 malloc,并将其分配给基,例如,

 unsigned char* base = malloc(STACKSIZE);
 if (!base) out_of_memory();

【讨论】:

  • 感谢您的帮助!我从来没有用 malloc 分配内存,所以我遇到了分段错误。
  • @melchyy 如果我的回答对您有帮助,那么您可以投票,并在几分钟内接受。
  • @Balter 我实际上没有足够的代表来投票,但我会接受!
【解决方案2】:

对于堆栈,最简单的可能是使用两个指针,

enum { STACKSZ = 100 };
char *base = malloc(STACKSZ);
char *top = base;

那你就可以推了

*top++ = 'H';

然后弹出

char x = *--top;

并通过

获得尺寸
int sz = top-base;

请注意,此代码不会检查堆栈上溢/下溢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多