我开始做一个小项目来测试我的知识,我遇到了一些奇怪的事情,我不介意向我解释发生了什么事情。
首先,我的代码:
#include <iostream>
#include<string>
#include<ctime>
#include<cstdlib>
using namespace std;
void mazeLayout(int* p_height, int* p_width, int* p_seed, string* p_curPath){
int start;
int stop;
int temp = *p_seed;
cout << temp << "\n";
while(temp > *p_width || temp > *p_height || temp <= 0){
if(temp <= 0){
temp = temp+8;
}
temp = temp-7;
cout << temp << "\n";
}
};
int main()
{
int width;
int *p_width = &width;
int height;
int *p_height = &height;
int seed;
int *p_seed = &seed;
string curPath;
string *p_curPath = &curPath;
int **maze;
srand(time(NULL));
seed = rand()+8*24;
seed = seed%50;
cout << "Welcome to the maze generator\n\n";
cout << "Width: ";
cin >> width;
cout << "Height: ";
cin >> height;
maze = new int* [height];
for(int i = 0; i < width; i++){
maze[i] = new int[width];
}
mazeLayout(p_height, p_width, p_seed, p_curPath);
for(int i = 0; i < width; i++ ){
delete[] maze[i];
}
delete[] maze;
}这可能很草率,正如我在上一篇文章中所指出的那样,如果我只是个初学者,我可能应该使用vector而不是指针,我现在并不是在寻找关于这方面的评论(尽管它们是受欢迎的)。
不管怎样,回到我的观点。当我运行这个程序并插入一个值( width > 10 )和height值(介于5到8之间)时,我会得到一个奇怪的输出。
它多次打印出如下内容:
once 007417B8 is 6584960然后程序就结束了,给了我一个信号,告诉我一切正常,没有错误。
任何其他数字组合都会导致正常结果(除了14 &3这样的组合之外,由于内存地址错误而导致崩溃)。
有人能告诉我这里到底发生了什么吗?
发布于 2015-05-02 16:20:21
我想你需要
maze = new int* [height];
for(int i = 0; i < height; i++){
// ^
// ^
maze[i] = new int[width];
}目前,您正在使用width的值进行循环。如果height大于width,那么这将导致为代码中的某些maze[i]未分配数组。然后,试图在以后的代码中访问这个未分配的内存将导致未定义的行为。
发布于 2015-05-02 16:21:41
在for循环中有一个bug:
maze = new int* [height];
for(int i = 0; i < width; i++){
maze[i] = new int[width];
}maze指向一个height元素数组,但是您的for循环会上升到width。如果width大于height,则会出现未定义的行为(可能写入随机内存),在这种情况下,任何事情都可能发生。
https://stackoverflow.com/questions/30004563
复制相似问题