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

看这篇随笔前,最好先看看我上一篇所写的 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. 从源码角度来看BeanFactory和ApplicationContext的关系

    大家好,我是小黑,这是年前的最后一篇推文,提前祝大家新年快乐~~ 这次我们从源码角度来聊聊BeanFactory和ApplicationContext的关系,讲一些网上文章不曾提到的点. 官方描述 先 ...

  2. MySQL 物理备份工具-xtrabackup

    安装 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install perl ...

  3. Java ArrayList类的简单介绍

    ArrayList类的说明: ArrayList类是List接口的实现类,java.util.ArrayList集合数据存储的结构是数组结构. 特点: 元素增删慢,查找快.(由于日常开发中使用最多的功 ...

  4. wannafly 27 D 巧妙求取约数

    链接:https://www.nowcoder.com/acm/contest/215/D来源:牛客网 题目描述 “我不知道你在说什么,因为我只是个pupil.”--绿魔法师 一个空的可重集合S. n ...

  5. 「2.0」一个人开发一个App,小程序从0到1,文件剖析

    不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...

  6. ORM执行原生SQL语句

    # 1.connectionfrom django.db import connection, connections cursor = connection.cursor() # cursor = ...

  7. C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子

    直接上代码了. Java控制台代码: package Test; import java.security.Key; import javax.crypto.Cipher; import javax. ...

  8. maven常用的远程仓库地址

    <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>ht ...

  9. sqlserver2008:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。

    在开始菜单中找到: 进入,点击左侧SQL Server服务, 将SQL Server(MSSQL.....)服务开启, 即可成功连接.

  10. 电脑开机后多了OneKey Ghost启动选项怎么解决

    原文地址:http://www.xitongcheng.com/jiaocheng/dnrj_article_18745.html 大多数用户在使用OneKey Ghost安装电脑系统后,会在开机启动 ...