指针问题,将固定长度的数组用指针传出, 接收后傻了...

OK_boom 2017-05-20 06:01:08

extern "C" bool __declspec(dllexport) __stdcall test1(PINT& pvOut, WORD& pvSize)
{
int lvOut[10];
for (int i = 0; i < 10; i++) {
lvOut[i] = i + 1;
}
pvOut = lvOut;
pvSize = 10;
return true;
}

PINT lvRet=NULL;
WORD lvSize=0;
char lvOut[1024 * 10];
int lvLen = 0;
if (test1(lvRet, lvSize)) {
for (int i = 0; i < lvSize; i++) {
int lvVal = *(lvRet + i);
lvLen += sprintf_s(lvOut + lvLen, 1024 * 10 - lvLen, "Element:%d, val:%d\r\n", i, lvVal);
}
CString lvT(lvOut);
ed_log.SetWindowTextW(lvT);
}

数全乱了.
...全文
208 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
OK_boom 2017-05-20
  • 打赏
  • 举报
回复
上层楼的问题也明白了,自己大意.
OK_boom 2017-05-20
  • 打赏
  • 举报
回复
引用 6 楼 cfjtaishan 的回复:
[quote=引用 3 楼 rocklee 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] lvOut是局部变量,调用完函数test1之后,lvOut数据就自动释放了。获得的数据和地址都是未定义的。 建议将lvOut定义为全局的数组,或加static定义数组,以改变lvOut的生命周期。
真的吗? pascal的编译器好像不是这样的, 我用codetyphon/delphi编写这个都能正确获得想要的结果. [/quote] 它是未定义的,意思就是你能得到想要的结果,但是并不能保证每次都能得到你想要的结果。[/quote] 谢谢了,请教下面这个Free(lvP)为什么会出错呢, 我的理解 是lvP与lvArray是指向同一块内存的.

void test2(){
	const int lvSize = 10;
	int *lvArray = (int*)malloc(sizeof(int)*lvSize);//new int[lvSize];
	for (int i = 0; i < lvSize; i++){
		lvArray[i] = i + 1;
	}
	PINT lvP = lvArray;
	for (int i = 0; i < lvSize; i++){
		printf("Element:%d=%d\n", i, *(lvP));
		lvP++;
	}
	free(lvP);  //出错
}
自信男孩 2017-05-20
  • 打赏
  • 举报
回复
引用 3 楼 rocklee 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] lvOut是局部变量,调用完函数test1之后,lvOut数据就自动释放了。获得的数据和地址都是未定义的。 建议将lvOut定义为全局的数组,或加static定义数组,以改变lvOut的生命周期。
真的吗? pascal的编译器好像不是这样的, 我用codetyphon/delphi编写这个都能正确获得想要的结果. [/quote] 它是未定义的,意思就是你能得到想要的结果,但是并不能保证每次都能得到你想要的结果。
OK_boom 2017-05-20
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
pvOut 指向的是一个局部数组变量,函数结束后该变量就销毁了
不对, 是CodeTyphon(freepascal的编译器)可以,但delphi的编译器还是会乱, 应该是在堆栈申请的内存,在函数退出时被及时销毁所致,对不对?
sdghchj 2017-05-20
  • 打赏
  • 举报
回复
任何C语言教程都会提及到这种作用域的问题,指针的生命周期比其指向的对象的生命周期长
OK_boom 2017-05-20
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
lvOut是局部变量,调用完函数test1之后,lvOut数据就自动释放了。获得的数据和地址都是未定义的。
建议将lvOut定义为全局的数组,或加static定义数组,以改变lvOut的生命周期。


真的吗? pascal的编译器好像不是这样的, 我用codetyphon/delphi编写这个都能正确获得想要的结果.
paschen 2017-05-20
  • 打赏
  • 举报
回复
pvOut 指向的是一个局部数组变量,函数结束后该变量就销毁了
自信男孩 2017-05-20
  • 打赏
  • 举报
回复
lvOut是局部变量,调用完函数test1之后,lvOut数据就自动释放了。获得的数据和地址都是未定义的。 建议将lvOut定义为全局的数组,或加static定义数组,以改变lvOut的生命周期。
说明文字在博客中。 摘录: 在学习的时候曾经百度了一下,想查找关于delphi中SafeArray的用法,没想到资料竟然如此之少,甚至连一篇相对完整的都没有。也许正如田师傅所说,现在高手们都在实行“技术封锁”了? 在CSDN技术中心有一篇关于C++的使用,说的比较详细。鉴于手中有田师傅写的代码,特拿来一部分对照自己学习的,翻译为Delphi版本。留作笔记,日后翻阅。 =============================================================================== SAFEARRAY的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元 素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的 值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。 SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。 Delphi中com组件或外部调用需要传递一个对象或者数组,这个时候可以考虑使用SafeArray。比如三层架构中通常需要将使用的ClientDataSet数据集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。 ===============================================================================

33,318

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧