首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用指针和rand() C++时遇到了一个有趣的错误

在使用指针和rand() C++时遇到了一个有趣的错误
EN

Stack Overflow用户
提问于 2015-05-02 16:15:46
回答 2查看 40关注 0票数 0

我开始做一个小项目来测试我的知识,我遇到了一些奇怪的事情,我不介意向我解释发生了什么事情。

首先,我的代码:

代码语言:javascript
复制
#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之间)时,我会得到一个奇怪的输出。

它多次打印出如下内容:

代码语言:javascript
复制
once 007417B8 is 6584960

然后程序就结束了,给了我一个信号,告诉我一切正常,没有错误。

任何其他数字组合都会导致正常结果(除了14 &3这样的组合之外,由于内存地址错误而导致崩溃)。

有人能告诉我这里到底发生了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-02 16:20:21

我想你需要

代码语言:javascript
复制
maze = new int* [height];
for(int i = 0; i < height; i++){
//                   ^
//                   ^            
    maze[i] = new int[width];
}

目前,您正在使用width的值进行循环。如果height大于width,那么这将导致为代码中的某些maze[i]未分配数组。然后,试图在以后的代码中访问这个未分配的内存将导致未定义的行为。

票数 2
EN

Stack Overflow用户

发布于 2015-05-02 16:21:41

for循环中有一个bug:

代码语言:javascript
复制
maze = new int* [height];
for(int i = 0; i < width; i++){
    maze[i] = new int[width];
}

maze指向一个height元素数组,但是您的for循环会上升到width。如果width大于height,则会出现未定义的行为(可能写入随机内存),在这种情况下,任何事情都可能发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30004563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档