C++ 在使用指针和rand()C++;

C++ 在使用指针和rand()C++;,c++,C++,我开始做一个小项目来测试我的知识,我遇到了一些奇怪的事情,我不介意向我解释正在发生的事情 首先,我的代码: #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){

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

首先,我的代码:

#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;
}
然后程序结束,给我一个信号,一切正常,没有错误

任何其他数字组合都会导致正常结果(14和3等组合除外,这些组合会由于内存地址错误而导致崩溃)

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

我想你需要

maze = new int* [height];
for(int i = 0; i < height; i++){
//                   ^
//                   ^            
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i
与当前一样,您正在使用
width
的值进行循环。如果
高度
大于
宽度
,则这将导致代码中某些
迷宫[i]
的未分配数组。然后,在代码中稍后尝试访问此未分配内存将导致未定义的行为。

我认为您需要

maze = new int* [height];
for(int i = 0; i < height; i++){
//                   ^
//                   ^            
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i
与当前一样,您正在使用
width
的值进行循环。如果
高度
大于
宽度
,则这将导致代码中某些
迷宫[i]
的未分配数组。然后,在代码中稍后尝试访问此未分配内存将导致未定义的行为。

我认为您需要

maze = new int* [height];
for(int i = 0; i < height; i++){
//                   ^
//                   ^            
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i
与当前一样,您正在使用
width
的值进行循环。如果
高度
大于
宽度
,则这将导致代码中某些
迷宫[i]
的未分配数组。然后,在代码中稍后尝试访问此未分配内存将导致未定义的行为。

我认为您需要

maze = new int* [height];
for(int i = 0; i < height; i++){
//                   ^
//                   ^            
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i

与当前一样,您正在使用
width
的值进行循环。如果
高度
大于
宽度
,则这将导致代码中某些
迷宫[i]
的未分配数组。然后尝试在代码中稍后访问此未分配内存将导致未定义的行为。

您在
for
循环中有一个错误:

maze = new int* [height];
for(int i = 0; i < width; i++){
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i

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

for
循环中有一个bug:

maze = new int* [height];
for(int i = 0; i < width; i++){
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i

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

for
循环中有一个bug:

maze = new int* [height];
for(int i = 0; i < width; i++){
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i

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

for
循环中有一个bug:

maze = new int* [height];
for(int i = 0; i < width; i++){
    maze[i] = new int[width];
}
maze=newint*[height];
对于(int i=0;i


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

main
开头声明所有这些指针的原因是什么?他们没有任何真正的目的,除了让你陷入不必要的麻烦。似乎您是“如果函数需要指针,那么我必须声明指针”的受害者。错误:
mazeLayout(&height,&width,&seed,&curPath)
@PaulMcKenzie是的,我想那会更有效,老实说,我甚至不知道为什么我认为这比使用ref更有效。我评论中的
&
是操作员的地址,而不是引用。是的,它们有相同的语法,但一个与另一个无关。啊,我明白你现在说的了。我用的那本书没有涵盖这一事实,那甚至是一种可能性!非常感谢你向我指出这一点@FutureWizard在这种情况下,您可能需要选择一个。在
main
开头声明所有这些指针的原因是什么?他们没有任何真正的目的,除了让你陷入不必要的麻烦。似乎您是“如果函数需要指针,那么我必须声明指针”的受害者。错误:
mazeLayout(&height,&width,&seed,&curPath)
@PaulMcKenzie是的,我想那会更有效,老实说,我甚至不知道为什么我认为这比使用ref更有效。我评论中的
&
是操作员的地址,而不是引用。是的,它们是红色的