题:用指针作为形参,怎么在函数内开辟空间并返回给实参

今天遇到了一个C/C++语言问题:

如下:

——————————————————————————————————————————-——

#include <stdio.h>

#include <iostream>

using namespace std;

void fun(char *p)
{
    p = (char *)malloc(100);//由于p是局部变量,所以fun函数结束,p便被销毁
}
int main(int argc, char *argv)
{
    char *str = NULL;
    
    fun(str);//str一直都是NULL;

    strcpy(str, "Hello world");

    cout << str <<endl;

    return 0;

}

————————————————————————————————————————————

结果编译出来没有问题,但是在执行的时候程序奔溃了,这是由于strcpy(str, "Hello world");将"Hello world"复制给str指针,但是str指针为空指针导致。为什么str会是空指针呢?还有这么开辟空间之后并返回给main()中的str指针呢?

这是由于fun()函数中的p指针只是str的一个副本,作为形参,虽然给p开辟了内存空间并指向这块空间,但是fun()函数结束p就被销毁了。

怎么样才能给str开辟空间呢?

代码如下:

—————————————————————————————————————————————

void fun(char **p)//p指向str的地址
{
    *p = (char *)malloc(100);//*p = str,代表给str开辟空间,即使p被销毁str依旧指向开辟的空间
}
int main(int argc, char *argv)
{
    char *str = NULL;
    
    fun(&str);//所以可以传值为str的地址

    strcpy(str, "Hello world");

    cout << str <<endl;

    return 0;
}

——————————————————————————————————————————————

在这个程序里面,传给fun()函数的是指针str的地址,fun()函数的形参为**p,给*p开辟空间就相当于给str开辟空间,即使fun()函数结束形参p被销毁,开辟的空间依旧存在,str依旧指向这块内存空间。

第二种方法,通过引用:

——————————————————————————————————————————————

#include <stdio.h>
#include <iostream>

using namespace std;

void fun(char* &p)//或者给指针取引用
{

    p = (char *)malloc(100);//由于p是str的别名,给p开辟空间就是给str开辟空间

}

int main(int argc, char *argv)
{
    char *str = NULL;
    
    fun(str);//str一直都是NULL;

    strcpy(str, "Hello nihao");

    cout << str <<endl;

    return 0;

}

——————————————————————————————————————————————


阅读更多
上一篇C语言中printf()函数的使用及其各种输出格式的介绍
下一篇C语言运算符优先级详细介绍
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭