我有一个相对简单的问题,我尽量保持尽可能小的问题,但想要包含一个例子,以便人们理解我所引用的内容。
我有一个声明局部变量(case digit
when '1'
# ...
when '2'
# ...
end
)的函数,然后我使用指针将该unsigned int
的值复制到指针。我知道在该函数结束后,该局部变量将不再存在。对我来说唯一真正重要的是价值。然后我尝试将其传递给unsigned int
,func2()
必须有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 *
时,我做错了什么?
答案 0 :(得分:0)
问题似乎在这里
unsigned int val = *(unsigned int) arg;
形成不良,如果它完全编译我会非常惊讶,但既然你说问题是印刷值很奇怪,我会认为这是原因,正确的方法是
unsigned int val = *(unsigned int *) arg;
表示将arg
强制转换为unsigned int
指针并取消引用它。
有一些事情值得一提
在调用者返回后,传递指针的原始值是否不再有效是无关紧要的,因为如果顺序调用它func2()
应该在调用者之前返回,因此释放将之后发生,因此该值在func2()
的生命周期内有效。
现在存储在val
中的函数内部的值存在于func2()
的堆栈帧中,并且是原始值的副本,但原则上位于不同的内存位置。 / p>
如果此函数将在另一个线程中执行,则不能假设您在启动新线程的函数返回之前复制了该值,因此您需要将值存储在堆中,如下所示
int *pointer;
pointer = malloc(sizeof pointer);
if (pointer == NULL) {
handle_allocation_error();
} else {
*pointer = value;
func2(pointer);
pointer = NULL; // Prevent having a dangling
// pointer
}
并且在func2()
的某个时刻,您需要free()
指针。
原则上,考虑到您的示例代码与您的实际代码不同,这将起作用。下一次,包括实际的代码,如果真的太多,写一个可以重现问题的小版本。有时候,当你写这么小的版本时,你会发现为什么意外的行为正在发生,你根本不需要提问。
此外,
中不需要(void *)
func2((void *) pointer);
刚
func2(pointer);
应该编译好。