2013-08-03 41 views
0

我有这样在C关于指针++

void some_func(some_type *var) 
{ 
    // do something a get a var2 of type some_type* 
    var = var2; 
} 

的功能和主要我有

some_type *var; 
some_func(var); 
print_var(var); 

,但我得到一个分段错误,当我运行程序。调试显示print_var是问题,好像var没有任何价值。 var2使用new some_type初始化,所以我认为我不需要为var这样做。

但是当我在主做var = new some_type,我手工克隆(的var2每个数据复制到var)在some_func,我不明白的错误。

我的问题在哪里?我不是真的习惯于指针和内存分配的东西,但我认为这两种方式应该工作。我错了吗?

也许主要的问题是当我在函数中使用new分配一个指针,然后将其地址保存在一个指针参数中时,函数完成时是否释放内存?

+0

如果发布整个代码会更好。 –

+0

这需要我很多。我的代码现在可以工作,但正如我所说,不是我在问题中写的方式。也许主要问题是当我在函数中使用'new'分配一个指针,然后在指针参数中保存它的地址时,函数完成时内存是否被释放? – vfsoraki

+1

@edwinc的答案是正确的。 'some_type * var'表示'var'是一个指向'some_type'的指针,它由调用者提供。当你在你的函数中声明'var = ...'时,你只是改变'var'的本地副本,导致它忘记了调用者设置它指向什么,如果有的话。 '''确保'var'确实是调用者的实际变量,而不是本地副本,所以当你分配给'var'时,你正在分配给调用者的变量。 –

回答

3

你需要你的定义修改为:

void some_func(some_type*& var) 
    { 
     // var will also be changed on the caller side 
     var = var2; 
    } 

注意,并将其传递给指针的引用使指针的值可以由被叫用户进行更新。

+0

谢谢,非常快的答案:D – vfsoraki

1

您的someType *varmain()是本地的主要和*var函数是该函数的本地。

因此,功能var指向var2,但不是主要存在的那个。

+0

谢谢,现在我明白了。 – vfsoraki

1

您按照价值通过var。这意味着var的副本在堆栈中制作,与主要的var分开。该副本随后使用var2进行初始化。但是,当some_func退出时,堆栈弹出,并且副本丢失。主要声明的var未更改。

要解决这个问题,一种可能的方法是让some_func返回一个指针值,然后您可以将其指定给var

或者,通过引用您的some_func申报改为

void some_func(some_type *& var)

这通过var,这意味着,对你而言,在some_funcvar是相同mainvar