那么你可以查查指针或数组,我的就是因为数组越界,当然,还有下面一个原因。如果是下面这个原因,那么就new一个动态数组吧。
起因:我先int a[row+1][999]了一个数组,row是一个int型,初使化居然没问题。
经过:程序里运行到某一部份总是崩溃,发现那一部份的row都大于2000,当时郁闷啊,程序里死查活查都觉得逻辑上没问题啊。。。毕竟row小于1500时程序都正常,触发异常都是row很大的时候。莫非数组的最大大小有问题?
结果:带着这个问题终于发现程序中变量分配还有分栈和堆之分,分在堆上的是交由程序员控制的,是依赖你的内存大小的。而你分配的局部变量是分配到由操作系统管理的栈上的。而栈是有大小的!!!
linux系统可以用ulimit -a命令查看:
stack size (kbytes, -s) 8192
看到没?ubuntu默认8M,已经比windows传说的2M大多了。
如果你要开大一点,比如无限,只要在/etc/profile 的最后面添加ulimit -s unlimited 就可以了,source /etc/profile使修改文件生效。
献给C++的初学者,如果要用大数组 ,请用new的方式动态生成,new方式是分配在堆上的,只要你内存够大,哈哈。我也是初学者,一起进步吧!
下面是创建二维动态数组的一个示例:
代码: 全选
#include <iostream>
int main()
{
int **x ; //创建一个指向指针x[row]的指针x
const int row = 5 ;
const int col = 10 ;
x = new int *[row] ; //创建一个行指针,没错,在内存中连续分配的数组就是个指针
for(int j = 0 ; j < row ; j++)
{
x[j] = new int [col] ; //在第个行指针x[row]里再次创建col个int型变量
}
for(int i = 0 ; i < row ; i++)
{
for(int j = 0 ; j < col ; j++)
{
x[i][j] = i * j ; //x是指针,x[i]也是指针,x[i][j]终于不是了,如果你创建三维数组,那么x,x[i],x[i][j]都是指针,x[i][j][k]才不是哦。
std::cout << "x[" << i << "][" << j << "]="<< x[i][j] << std::endl;
}
}
//std::cout << "address of x : " << x << std::endl ;
//std::cout << "value of x : " << *x << std::endl ;
for(int i = 0 ; i < row ; i++)
{
//std::cout << "address of x[" << i << "] = "<< x[i] << std::endl ;
std::cout << "value of x[" << i << "] = "<< *x[i] << std::endl ;
delete [] x[i] ; //使用完了后记得要delete啊,不然就是内存泄漏。先delete 后创建的
}
delete [] x ; //再delete先创建的。
}