码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 中全局/静态存储区的内存污染问题

时间:2019-11-01 20:45:50      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:div   初始化   strong   print   include   一段   img   check   修改   

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

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

先看代码

 

 1 #pragma once
 2 #pragma execution_character_set("utf-8")
 3 #include <iostream>
 4 #include <cstdio>
 5 using std::cout;
 6 using std::endl;
 7 
 8 const int COLUMNS = 8;
 9 const int ROWS = 8;
10 int Matrix[COLUMNS][ROWS] = { 0 };
11 
12 void print()
13 {
14     for (int row = 0; row < ROWS; ++row)
15     {
16         for (int col = 0; col < COLUMNS; ++col)
17         {
18             cout << Matrix[row][col] << " ";
19         }
20         cout << endl;
21     }
22     cout << endl;
23 }
24 
25 bool check(int row, int col)
26 {
27     //检查列
28     for (int r = 0; r < row; ++r)
29     {
30         if (Matrix[r][col])
31             return false;
32     }
33     for (int r = row - 1, c = col - 1; r != -1 && c != -1; --r, --c)
34     {
35         if (Matrix[r][c])
36             return false;
37     }
38     for (int r = row - 1, c = col + 1; r != -1 && c != COLUMNS; --r, ++c)
39     {
40         if (Matrix[r][c])
41             return false;
42     }
43     return true;
44 }
45 
46 
47 void writeQueen(int currentRow)
48 {
49     static int count = 0;
50     if (currentRow == ROWS)
51     {
52         ++count;
53         cout << count << endl;
54         print();
55         //return;    //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
56     }
57 
58     int col = 0;
59     for (; col < COLUMNS; ++col)
60     {
61         Matrix[currentRow][col] = 1;
62         //print();
63         if (check(currentRow, col))
64             writeQueen(currentRow + 1);
65         Matrix[currentRow][col] = 0;
66     }
67 }
68 
69 int main()
70 {
71     writeQueen(0);
72 }

 

 

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

技术图片

 

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

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

 1 void writeQueen(int currentRow)
 2 {
 3     static int count = 0;
 4     if (currentRow == ROWS)
 5     {
 6         ++count;
 7         cout << count << endl;
 8         print();
 9         //return;    //此处应有return,问题代码正是由于这儿没有写return导致后面访问越界而产生的。
10     }
11 
12     int col = 0;
13     for (; col < COLUMNS; ++col)
14     {
15         Matrix[currentRow][col] = 1;
16         //print();
17         if (check(currentRow, col))
18             writeQueen(currentRow + 1);
19         Matrix[currentRow][col] = 0;
20     }
21 }

 

打断点进行调试。

技术图片

 

 技术图片

 

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

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

技术图片

 

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

为什么会出现这种情况?

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

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

 

c++ 中全局/静态存储区的内存污染问题

标签:div   初始化   strong   print   include   一段   img   check   修改   

原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/11779073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!