调用add(4)时,我的main()在下面崩溃。
据我所知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 :(得分:8)
问题是您已声明int*
但未给出任何指向的内容。你需要做的是用一个内存位置初始化它(省略错误检查)
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);
答案 1 :(得分:5)
在
*c = d;
指针c
未初始化,因此您的程序会运行到未定义的行为。您可以执行以下操作:
void add( int what, int* toWhat )
{
(*toWhat) += what;
}
并将其称为:
int initialValue = ...;
add( 4, &initialValue );
答案 2 :(得分:3)
您永远不会将任何内存分配给指针c
。指针必须引用有效的内存,并且您必须通过调用new
来自行分配该内存,例如写
int* c = new int();
在add
函数中。现在c
指向一个有效的内存块,其大小足以容纳int
。完成该内存后,请调用delete c
取消分配并将其释放回系统。
答案 3 :(得分:1)
您收到错误,因为c是未初始化的指针,因此它是未定义的行为。