指针铸造的局部变量

时间:2017-04-01 20:09:16

标签: c pointers memory

我遇到的一个问题是尝试将变量转换为内存以便稍后访问。

我在这里有一个完美的示例代码:

unsigned int *label = (unsigned int *)malloc(sizeof(unsigned int));
label = (unsigned int * ) 0xFFAAFFAA;

我的代码中的任何其他地方我都可以访问此值标签,当我尝试打印它时,它将指向0xFFAAFFAA作为其值。

但是,如果我尝试从这样的变量中分配:

 //all of this is inside a method.. so any variables declared would be local
    unsigned int localVariable = 0xFFFFFFFF;
      unsigned int *label = (unsigned int *)malloc(sizeof(unsigned int));
      label = &localVariable;

结果将是疯狂的:0x7f252d6b5f00 ..我只是假设它是内存中的一些随机地址。我知道这个问题是因为局部变量在函数内运行而不是全局变量。但我无法弄清楚这会是什么语法...

我想要定义局部变量的原因是因为函数中有其他逻辑可以添加和减去该变量..我把它留下来保持最小

编辑:所以我可以做这样的事情吗?

 unsigned int localVariable = 0xFFFFFFFF;
  unsigned int *label = (unsigned int *)malloc(sizeof(unsigned int));
  *label = localVariable;

1 个答案:

答案 0 :(得分:0)

听起来你想要的是创建一个指向函数变量的指针,然后在函数外部访问它。

第一个示例的问题是您分配内存并将其地址分配给label,但随后您覆盖label的值,导致您丢失对刚刚分配的内存的引用。您需要使用*运算符取消引用指针来写入您刚刚分配的内存地址。

第二个例子不起作用,因为你获取了局部变量的地址,然后当函数返回时该变量超出了范围。因此地址无效。

下面的示例分配空间,取消引用刚刚分配给指定地址的指针,然后将地址返回给调用者。

unsigned int *func()
{
    // allocate space (don't cast return value of malloc)
    unsigned int *label = malloc(sizeof(unsigned int));
    // dereference pointer and write value to allocated memory
    *label = 0xFFAAFFAA;
    // pass pointer to allocated memory to the calling function
    return label;
}

请记住,调用函数将负责在使用它时返回的内存上调用free以避免内存泄漏。