在下面的程序中,当程序进入while循环时,它会停止工作。当我试图在没有循环的情况下分配值时,它就很好了。 谁能告诉我这是什么问题? 我正在使用Visual Studio 2010。
#include <stdio.h>
#include<iostream.h>
#include <conio.h>
using namespace std;
int random(int min,int max);
struct pts
{
int x;
int y;
};
int main()
{
struct pts *p;
int w = 600,h=400;
int nmax,kmax,k=0,n=0;
while(k<5)
{
p[0].x = random(0,h-1);
p[1].y = random(0,w-1);
cout << p[0].x << " " << p[1].y << "\n";
k++;
}
getch();
return 0;
}
int random(int min,int max)
{
int n=0;
n=(rand()%(max-min+1))+min;
return n;
}
答案 0 :(得分:2)
while
循环本身工作正常。只是你在腐蚀记忆。你的问题是:
struct pts *p;
p[0].x = whatever;
没有将p
设置为有效的内存块。换句话说,你正在使用一个单位化的指针,因此未定义的行为,因此所有的赌注都是关闭的。
由于您(目前)似乎只使用p[0]
和p[1]
,因此您可以更改:
struct pts *p;
为:
struct pts p[2];
当然,如果你想要一个变量结构,你可以使用:
struct pts *p = new pts[500];
当然,用你想要的任何尺寸替换500.
您可能还想考虑升级到更新的编译器,iostream.h
和conio.h
是不合时宜的。
这是一个完整的程序,展示了如何做到这一点,至少在你决定在循环中更加“理智地”存储东西之前:
#include <iostream>
#include <stdlib.h>
struct pts
{
int x;
int y;
};
int random(int min,int max)
{
int n=0;
n=(rand()%(max-min+1))+min;
return n;
}
int main()
{
struct pts p[2];
int w = 600,h=400;
int k=0;
while(k<5)
{
p[0].x = random(0,h-1);
p[1].y = random(0,w-1);
std::cout << p[0].x << " " << p[1].y << "\n";
k++;
}
return 0;
}
示例运行:
183 286
377 115
193 535
186 492
249 421
(事实上,可能总是给出该序列,因为你没有调用srand
来设置种子 - 你的数字可能与我的不同但他们会每次都给你相同的序列。)
如果您想要更好的基线,请参阅:
#include <iostream>
#include <stdlib.h>
#include <time.h>
struct pts { int x; int y; };
int random (int min, int max) {
return (rand() % (max - min + 1)) + min;
}
int main (void) {
pts *p = new pts[5];
int w = 600, h = 400;
int k = 0;
srand (time (0));
while (k < 5) {
p[k].x = random (0, h - 1);
p[k].y = random (0, w - 1);
std::cout << p[k].x << " " << p[k].y << "\n";
k++;
}
delete[] p;
return 0;
}
通过删除不必要的东西来缩短代码,并消除你的未定义行为问题。
它还初始化随机数生成器并正确填充数组。