2010-08-18 157 views
3

当添加(4)被调用时,我的main()崩溃。函数返回指向int的指针

据我所知int * add,它应该返回一个指向整数的指针。然后,我应该可以主要说:

int * a = add(3);

返回一个指向int的指针。

请解释我做错了什么。

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int* add (int a) { 
    int * c, d; 
    d = a + 1; 
    *c = d; 
    cout << "c = " << c << endl; 
    return c; 
} 

int main(int argc, char *argv[]) 
{ 
    int a = 4; 

    int * c; 

    c = add(4); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+0

+1 - @橡胶靴是正确的 – ChrisBD 2010-08-18 14:38:07

+4

不,他不是。阅读理解,人。 '* c = d' does * not * make'c' point to'd'! – 2010-08-18 14:38:45

+1

比这更糟糕的是,您正在写入并返回一个未初始化的指针。 – 2010-08-18 14:38:47

回答

5

*c = d; 

指针c没有初始化,所以你的程序运行到未定义的行为。你可以这样做以下代替:

void add(int what, int* toWhat) 
{ 
    (*toWhat) += what; 
} 

,并调用它像这样:

int initialValue = ...; 
add(4, &initialValue); 
7

的问题是,你声明的int*,但没有给它任何指向。你需要做的是用一个内存位置初始化(checknig省略错误)

int* c = new int(); 
... 
*c = d; // Now works 

后来虽然你将需要确保,因为它是一个分配的资源来释放此内存。

更好的解决方案是使用引用。指针有几个令人讨厌的属性,包括单位值,NULL,需要免费等等......其中大多数不在参考文献中。这里是如何在这种情况下使用引用的例子。

void add (int a, int& c) { 
    int d; 
    d = a + 1; 
    c = d; 
    cout << "c = " << c << endl; 
} 

int c; 
add(4, c); 
+0

中得到一个简单的答案在C++中,使用'malloc'几乎肯定是错误的事情。 – 2010-08-18 14:41:03

+0

@Mike,同意了。只读取问题代码并假定它是一个C问题。更新了 – JaredPar 2010-08-18 14:42:17

+0

+1。 – Puppy 2010-08-18 14:59:05

3

您从不分配任何内存给指针c。指针必须指向有效的内存,并且您必须通过调用new来自己分配内存,例如写

int* c = new int(); 

add函数内。现在c指向一个足够容纳int的有效内存块。完成该内存后,请致电delete c将其解除分配并将其释放回系统。

+0

这个问题被标记为C++,所以使用'malloc'将是一个非常糟糕的主意。 – 2010-08-18 14:42:16

+1

好吧,不是一个坏主意(malloc在C++中完全合法),但不是最好的主意。虽然会修复。 – 2010-08-18 15:14:19

+0

你的回答非常有帮助。谢谢^ _ ^ – Mahmoud 2013-03-05 13:50:04

1

由于c是未初始化的指针,所以出现错误,因此它是未定义的行为。