关于char*输出参数,该怎么处理

关于char*输出参数
dll1.dll中有一个函数
fun1(char *szTemp)
{
    CString tmp;
    ...

    //tmp 获取一个很长的数据
    
    szTemp = tmp.GetBuffer(tmp.GetLength());   //此处有数据
    tmp.ReleaseBuffer();
}

另一个工程调用 dll1.dll

fun2()
{
    char *tmp;
    fun1(tmp);   //此处获取不到数据
}

求解。
试了好多方法,一直不行, strcpy , memcpy 都

------解决方案--------------------
fun1(char *&szTemp)

------解决方案--------------------
先分配个空间,在使用楼上的方法
引用:
fun1(char *&szTemp)

------解决方案--------------------
void GetMemory(char *p)
{
p = (char *)malloc(100);
}

void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}

请问运行Test函数会有什么样的结果?
答:
函数时按值传递了一个指针变量。函数里改变的是指针副本p的值,使其指向所申请的内存,而str仍然指向NULL。之后试图对NULL地址做写入操作,内存访问违规

------解决方案--------------------

szTemp = tmp.GetBuffer(tmp.GetLength()); //此处有数据
改成
*szTemp = *tmp.GetBuffer(tmp.GetLength()); //此处有数据
试试
------解决方案--------------------
试试下边的
test()
{
    char *szBuff[100] = {0};//缓冲区长度根据实际情况定义
    func1(szBuff);
}
fun1(char *szTemp)
{
  CString tmp;
  ...

  //tmp 获取一个很长的数据
  strcpy(szTemp,tmp.GetBuffer(iLen));
  tmp.ReleaseBuffer();
}


------解决方案--------------------
空间你先分配然后再传进去指针。


fun(char **tmp)二级指针或者使用指针引用也可以。

我喜欢二级指针。
------解决方案--------------------
你的指针是按值传进去的,所以szTemp = tmp.GetBuffer(tmp.GetLength()); 你真正改变的是形参的值,并没有修改真正的指针,你要是想修改外界指针的话没这样f(char **szTemp),然后*szTemp = tmp.GetBuffer(tmp.GetLength()); 这样就真正修改了来自外界指针的数值,你再访问就可以了
------解决方案--------------------
tmp.ReleaseBuffer();的时候把数据释放了。

可以在外面传递一个已经分配内存空间的指针进来,或者是传递一个指针地址进来在函数里面分配空间。
fun1(char *szTemp)
{
  CString tmp;
  ...

  //tmp 获取一个很长的数据
   
  strcpy(szTemp, tmp.GetBuffer(tmp.GetLength())); //此处有数据
  tmp.ReleaseBuffer();
}



fun2()
{
  char *tmp=new char[1000];
  fun1(tmp); //此处获取不到数据
}


或是
fun1(char **szTemp)
{
  CString tmp;
  ...

  //tmp 获取一个很长的数据
  *szTemp = new char[tmp.GetLength()+1];
  strcpy(szTemp, tmp.GetBuffer(tmp.GetLength())); //此处有数据
  tmp.ReleaseBuffer();
}



fun2()
{
  char *tmp;
  fun1(&tmp); //此处获取不到数据
}