司二 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条)

报告相同问题?

悬赏问题

  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题