指向Cast的局部变量

时间:2017-04-01 21:55:45

标签: c pointers

我有一个相对简单的问题,我尽量保持尽可能小的问题,但想要包含一个例子,以便人们理解我所引用的内容。

我有一个声明局部变量(case digit when '1' # ... when '2' # ... end )的函数,然后我使用指针将该unsigned int的值复制到指针。我知道在该函数结束后,该局部变量将不再存在。对我来说唯一真正重要的是价值。然后我尝试将其传递给unsigned intfunc2()必须有void *作为参数(不是我的选择),只需查看值,我认为应该是2因为我添加了1

void func2( void * arg){
    //was not my choice to have void * be the argument.. was a requirment

    unsigned int val = *(unsigned int) arg;
    //When I print this the value should be 2..


}

void createPointer(){
  unsigned int localVariable = 1;
  localVariable = localVariable + 1;
  unsigned int *pointer = &localValue;
  *pointer = localValue;
  //my goal here is to copy the VALUE of the local variable
  //as I need this pointer to still point to this value after this function returns

  //in my actual code, this function is on a whole seperate file.. so it is really important that the pointer is stored in memory

func2( (void *) pointer );


}

int main(int argc, char *argv[]){
   createPointer();
}

然而,当我尝试在val中打印变量func2()时,它只是打印出一些随机地址作为文本,这使我认为它仍然以某种方式引用localVariable ,我只想复制。的值。

所以,我的问题是有一个正确的语法方式来复制局部变量的值吗?当我投射和弃用void *时,我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题似乎在这里

unsigned int val = *(unsigned int) arg;

形成不良,如果它完全编译我会非常惊讶,但既然你说问题是印刷值很奇怪,我会认为这是原因,正确的方法是

unsigned int val = *(unsigned int *) arg;

表示将arg强制转换为unsigned int指针并取消引用它。

有一些事情值得一提

  1. 在调用者返回后,传递指针的原始值是否不再有效是无关紧要的,因为如果顺序调用它func2()应该在调用者之前返回,因此释放将之后发生,因此该值在func2()的生命周期内有效。

  2. 现在存储在val中的函数内部的值存在于func2()的堆栈帧中,并且是原始值的副本,但原则上位于不同的内存位置。 / p>

  3. 如果此函数将在另一个线程中执行,则不能假设您在启动新线程的函数返回之前复制了该值,因此您需要将值存储在堆中,如下所示

    int *pointer;
    pointer = malloc(sizeof pointer);
    if (pointer == NULL) {
        handle_allocation_error();
    } else {
        *pointer = value;
        func2(pointer);
        pointer = NULL; // Prevent having a dangling
                        // pointer
    }
    
  4. 并且在func2()的某个时刻,您需要free()指针。

    原则上,考虑到您的示例代码与您的实际代码不同,这将起作用。下一次,包括实际的代码,如果真的太多,写一个可以重现问题的小版本。有时候,当你写这么小的版本时,你会发现为什么意外的行为正在发生,你根本不需要提问。

    此外,

    中不需要(void *)
    func2((void *) pointer);
    

    func2(pointer);
    

    应该编译好。