读书人

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

发布时间: 2013-01-23 10:44:49 作者: rapoo

关于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); //此处获取不到数据
}


[解决办法]
fun1(char *szTemp)
{
CString tmp;
...

//tmp 获取一个很长的数据

szTemp = tmp.GetBuffer(tmp.GetLength()); //此处有数据
tmp.ReleaseBuffer();
}

问题出在tmp是局部变量,fun1函数完成后tmp被释放了,Buffer也就不存在了


[解决办法]

引用:
tmp.ReleaseBuffer();的时候把数据释放了。

可以在外面传递一个已经分配内存空间的指针进来,或者是传递一个指针地址进来在函数里面分配空间。

C/C++ code
fun1(char *szTemp)
{
CString tmp;
...

//tmp 获取一个很长的数据

strcpy(szTemp, tmp.GetBuffer(t……


正解
LZ没有分配内存 就把指针传进去了
在fun1里有数据 那是临时变量的内存 fun1退出时内存被释放了

读书人网 >C++

热点推荐