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更有效。我评论中的&
是操作员的地址,而不是引用。是的,它们是红色的