void test_find()
{
}
void CMFCApplication3Dlg::OnBnClickedTest()
{
int nTempA = 123;
MessageBox(CString(std::to_string(nTempA).c_str()));
test_find();
MessageBox(CString(std::to_string(nTempA).c_str()));
}
问题是:
上述代码的运行结果是,两次显示 nTempA的结果为123;
通过实现test_find函数中的代码,让第二次的nTempA结果为456;
知识点一:
栈:
一个进程中的栈空间大小在Windows上默认为1M,当然可以通过VisualStudio配置;
栈的应用范围是相对于线程;
进栈的方式是,先进入栈的最大地址(Windows,别的系统或环境需要验证),然后后依次向小的地址入栈;
栈中元素不一定是紧紧相挨着,有可能中间空着几个字节,但是理论上元素是依次的,只是中间有可能有字节间隔;
栈的空间是连续的;
堆:
是从小地址向大地址创建建立;
堆的空间方式更像是动态链表;
每一个线程都有一个栈,但是每一个应用程序通常都只有一个堆
解析:
如果看到文章题目,当然就有思路了;
这里普及两个基本知识点;
简单解答代码:
void test_find()
{
int ntempB = 456;
int i = 0;
int * pntempB = &ntempB;
for (;;)
{
if (*(pntempB + i) == 123)
{
memcpy(pntempB + i, &ntempB, 4);
break;
}
i++;
}
}
但是上述代码实现还是有一点点问题,就是假定了连续元素间的空格距离为4个字节,所以不够严谨;
解析代码2:
void test_find1()
{
int ntempB = 456;
int i = 0;
unsigned char * pntempB = (unsigned char *)(&ntempB);
for (;;)
{
if ( *((int *)(pntempB + i)) == 123)
{
memcpy(pntempB + i, &ntempB, 4);
break;
}
i++;
}
}
这段代码完美的解决了上述问题;
没有看过别人怎么做,这只是一个简单实现;
关于堆,栈,可以参考:
https://blog.csdn.net/devil_net/article/details/79787619
https://www.cnblogs.com/tongye/p/9687442.html
613

被折叠的 条评论
为什么被折叠?



