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

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);
}

数全乱了.
...全文
185 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的生命周期。

33,311

社区成员

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

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