一道C++关于“栈”的问题

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chinabinlang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值