今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题。

看这篇随笔前,最好先看看我上一篇所写的 c++ 内存分配中一个有趣的小问题

先看代码

 #pragma once
#pragma execution_character_set("utf-8")
#include <iostream>
#include <cstdio>
using std::cout;
using std::endl; const int COLUMNS = ;
const int ROWS = ;
int Matrix[COLUMNS][ROWS] = { }; void print()
{
for (int row = ; row < ROWS; ++row)
{
for (int col = ; col < COLUMNS; ++col)
{
cout << Matrix[row][col] << " ";
}
cout << endl;
}
cout << endl;
} bool check(int row, int col)
{
//检查列
for (int r = ; r < row; ++r)
{
if (Matrix[r][col])
return false;
}
for (int r = row - , c = col - ; r != - && c != -; --r, --c)
{
if (Matrix[r][c])
return false;
}
for (int r = row - , c = col + ; r != - && c != COLUMNS; --r, ++c)
{
if (Matrix[r][c])
return false;
}
return true;
} void writeQueen(int currentRow)
{
static int count = ;
if (currentRow == ROWS)
{
++count;
cout << count << endl;
print();
//return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
} int col = ;
for (; col < COLUMNS; ++col)
{
Matrix[currentRow][col] = ;
//print();
if (check(currentRow, col))
writeQueen(currentRow + );
Matrix[currentRow][col] = ;
}
} int main()
{
writeQueen();
}

运行出来后结果是这样的:

即每个结果的序号都是1,明显不符合我的意图。

之后就是寻找错误原因了,定位到这一段代码上:

 void writeQueen(int currentRow)
{
static int count = ;
if (currentRow == ROWS)
{
++count;
cout << count << endl;
print();
//return; //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
} int col = ;
for (; col < COLUMNS; ++col)
{
Matrix[currentRow][col] = ;
//print();
if (check(currentRow, col))
writeQueen(currentRow + );
Matrix[currentRow][col] = ;
}
}

打断点进行调试。

发现当执行Matrix[currentRow][col] = 0;这一句代码后count的值由1变为了0。

为什么会这样呢?我看了一下地址:

他两的地址居然是同一个!

为什么会出现这种情况?

count和Matrix都定义在全局区,Matrix的初始化语句为Matrix[8][8],原本Matrix所控制的内存空间与count的并不冲突,可是我访问Matrix时却越界了,我访问的是Matrix[8][0],而系统在分配内存时却恰好将count分配到了Matrix之后,这两变量的缘分太深了,没办法。。。由此造成了内存污染,当修改Matrix时无意中也造成了count被修改。

所以,归根结底还是访问越界了!

c++ 中全局/静态存储区的内存污染问题的更多相关文章

  1. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...

  2. C++内存分区:堆、栈、自由存储区、全局/静态存储区和常量存储区

    日志                                                                                                  ...

  3. 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...

  4. (转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始 ...

  5. 【转】C中的静态存储区和动态存储区

    一.内存基本构成    可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同.    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个 ...

  6. c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数 ...

  7. linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在须要的时候分配,在不须要的时候自己主动清除的变量的存储区.里面的变量一般是局部变量.函数參数等.在一个进程中.位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆 ...

  8. [整理]C中的静态存储区

    静态存储区:即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些 ...

  9. Java中的堆内存、栈内存、静态存储区

    一.栈 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用.但缺点是,存在栈中的数据大小与生存 ...

随机推荐

  1. css常用单词

    <!-- type = circle表示空心圆 -->     <!-- type = disc 表示实心圆 -->     <!-- type = square表示方块 ...

  2. 学习集合Collection_通用方法

    Collection 常用接口 集合List和Set通用的方法 public boolean add(E e) 添加对象到集合 public boolean remove(E e) 删除指定元素 pu ...

  3. ArcEngine版本管理(Version)项目总结

    需求: 在ArcGIS项目中,大型的数据库都是使用ArcSDE进行连接管理.使用的数据版本(Version)都是默认版本(sde.default).这样多个人员在编辑的过程中就直接编辑的是默认版本数据 ...

  4. .NET编程周记第3期-2020年1月19日

    整理了2020年1月19日这周阅读的几篇有趣的和.NET开发相关的文章.在这里和大家分享. 0x00 Introducing Nullable Reference Types in C# 如标题所示, ...

  5. crawler 听课笔记 碎碎念 3 关于python的细枝末节的回顾复习

    和廖雪峰大神的教程学了几遍后,还是出现了许多不足,于是就做一些回顾,列出一些python的细节问题,有一些就提一下,如果发现不清楚的话 还请移步https://www.liaoxuefeng.com/ ...

  6. MySQL 行列相互转换

    行列相互转换 /*创建表*/ CREATE TABLE ic ( NAME ), Product ), amount INT ); INSERT INTO ic VALUES (), (), (), ...

  7. 2019CSP初赛游记

    Day 0 作为一个初三的小蒟蒻…… 对于J+S两场比赛超级紧张的…… 教练发的神奇的模拟卷…… 我基本不会…… 就这样吧…… Day 1 Morning 不知道怎么就进了考场…… 周围坐的全是同学( ...

  8. msi通过powershell安装、卸载

    function install_msi($url) { $telemetry = @{ DisplayName = "Telemetry Service"; filename = ...

  9. Zero down time upgrade with OGG -from 11g to 12c.

    High level steps upgrade from 11g to 12c database: 1)    Check network between source and target. 2) ...

  10. xhemj资料

    Github https://github.com/xhemj Gitee码云 https://gitee.io/xhemj Cnblogs博客园 https://www.cnblogs.com/xh ...