c++ 中全局/静态存储区的内存污染问题
今天研究用回溯法解决八皇后问题,碰到了一个有趣的小问题。
看这篇随笔前,最好先看看我上一篇所写的 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++ 中全局/静态存储区的内存污染问题的更多相关文章
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...
- C++内存分区:堆、栈、自由存储区、全局/静态存储区和常量存储区
日志 ...
- 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...
- (转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
程序在内存有五个存在区域: A:动态区域中的栈区 B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量 (这个区域又可以进一步细分为:初始化的全局变量和静态变量 以及 未初始 ...
- 【转】C中的静态存储区和动态存储区
一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个 ...
- c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区
在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数 ...
- linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在须要的时候分配,在不须要的时候自己主动清除的变量的存储区.里面的变量一般是局部变量.函数參数等.在一个进程中.位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆 ...
- [整理]C中的静态存储区
静态存储区:即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些 ...
- Java中的堆内存、栈内存、静态存储区
一.栈 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用.但缺点是,存在栈中的数据大小与生存 ...
随机推荐
- MariaDB的备份与主从、高可用实践
1.编写脚本,支持让用户自主选择,使用mysqldump还是xtraback全量备份. [root@test-centos7-node1 scripts]# cat chose_backup_mysq ...
- Spring Boot2 系列教程 (十) | 实现声明式事务
前言 如题,今天介绍 SpringBoot 的 声明式事务. Spring 的事务机制 所有的数据访问技术都有事务处理机制,这些技术提供了 API 用于开启事务.提交事务来完成数据操作,或者在发生错误 ...
- 使用Merkle树检测数据不一致(翻译)
背景 Cassandra的逆熵功能使用Merkle树来检测副本之间的数据不一致. 定义 Merkle树是一种哈希树,其中的叶子包含各个数据块的哈希值,父节点包含其各自的子节点的哈希值.它提供了一种有效 ...
- 单调队列优化 dp
The only difference between easy and hard versions is the constraints. Vova likes pictures with kitt ...
- 【转】程序员"青春饭"问题之我见
1. 问题描述问题1: 什么是程序员?在本文中程序员的定义为: 拥有编程技能,在IT.互联网公司打工的IT从业人员.程序员与很多行业最大的不同是该行业的形成时间短:1954年第一台计算机才诞生,而中医 ...
- c语言-输出圆形
#include<stdio.h> #define high 100//定义界面大小 #define wide 100 void Circle(int ridus) //确定坐标 {int ...
- Qt Installer Framework翻译(7-3)
控制脚本 对于每个安装程序,您可以指定一个控制脚本,用来与安装程序的部分UI或功能进行交互.控制脚本可以在向导中添加和删除页面,更改现有页面,进行附加检查以及通过模拟用户单击来与UI交互.例如,这允许 ...
- 对于kvm配置ssh
首先我们要让自己的机器开启ssh服务 首先更新源 sudo apt-get update 安装ssh服务 sudo apt-get install openssh-server 检测是否已启动 ps ...
- CSS-11-外边距
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【WPF学习】第二十五章 日期控件
WPF包含两个日期控件:Calender和DatePicker.这两个控件都被设计为允许用户选择日期. Calendar控件显示日期,在与Windows操作系统中看到的日历(例如,当配置系统日期时看到 ...