司二 2021-05-09 11:34 采纳率: 80.8%
浏览 43
已采纳

C++使用指针为什么要为其分配空间

typedef struct     
{
	double real;	// 复数的实部
	double imag;	// 复数的虚部
}Complex;

void InitComplex(Complex* z) {
	z = new Complex; // 给z分配了一块内存空间
}

void AssignComplex(Complex *&z, double a, double b) {
	z->real = a;
	z->imag = b;
}

int main()
{
	while (1) {
		double a1, b1;
		Complex* z1 = NULL;
		//z1 = new Complex; // 给z1分配了一块内存空间
		// InitComplex(z1);  // 无法用函数进行初始化

		cout << "请输入第一个复数的实部:";
		cin >> a1;
		cout << "请输入第一个复数的虚部:";
		cin >> b1;

		AssignComplex(z1, a1, b1);
		cout << "第一个复数为:";
		Display(z1);

	}

}

用的是Visual Stdio 2019

用结构体创建指针,

1.为什么初始化指针为NULL,报错:

   0x004C2572 处(位于 AssignComplex.exe 中)引发的异常:

   0xC0000005: 写入位置 0x00000000 时发生访问冲突。

2.为什么我调用函数为其分配空间,报错:

    错误C4700:使用了未初始化的局部变量"z1"

3.只有直接为其分配空间才能运行:

   z1 = new Complex;

4.为什么这个指针一定要为其分配空间才可以,初始化为NULL不可以吗

  • 写回答

3条回答 默认 最新

  • benbenli 2021-05-09 13:03
    关注

    1. NULL在C/C++语言里就是表示没有分配空间,其实就是0。没分配空间,指针没有指向有效的内存空间,当然就没法用。

    2. 可以调用函数分配空间,但是你传的参数或者返回值类型需要修改。

    2.1 可以修改参数类型位Complex**,因为你需要提供一各地址来接受一各指针,所以是指针的指针。代码如下。是不是更晕了?

     

    void InitComplex(Complex** z) {
    	*z = new Complex; // 给z分配了一块内存空间
    }
    
    
    int main()
    {
    	while (1) {
    		double a1, b1;
    		Complex* z1 = NULL;
    		InitComplex(&z1);

    2.2 你也可以修改函数的返回值类型void为Complex*,这样简单些。

    Complex* InitComplex(void) {
    	return new Complex; // 给z分配了一块内存空间
    }
    
    
    int main()
    {
    	while (1) {
    		double a1, b1;
    		Complex* z1 = InitComplex();

    2.3 当然最简单的就是不需要定义分空间的函数,直接分配空间。当然如果分配空间之前要进行复杂的处理,或者根据不同配置实例化不同子类,定义函数分配空间是非常号的做法(你可以搜索设计模式里的工厂设计模式,拓展纸是面)

    int main()
    {
    	while (1) {
    		double a1, b1;
    		Complex* z1 = new Complex();

    3. 上面2.1/2.2/2.3已经回答了。

    4. 上面1已经回答了。

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 poi合并多个word成一个新word,原word中横版没了.
  • ¥15 【火车头采集器】搜狐娱乐这种列表页网址,怎么采集?
  • ¥15 求MCSCANX 帮助
  • ¥15 机器学习训练相关模型
  • ¥15 Todesk 远程写代码 anaconda jupyter python3
  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?