当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 解决了一个数组分配问题,顺便说说创建动态二维数组
帖子发表于 : 2015-11-18 20:20 

注册: 2010-10-31 9:15
帖子: 507
系统: kubuntu 16.04
送出感谢: 0 次
接收感谢: 13
可能有人碰到过这样的事:在Qt里编写完程序后用debug模式编译运行,结果顺利运行,可在release模式下编译后,运行到某环节出现闪退。。。。。。
那么你可以查查指针或数组,我的就是因为数组越界,当然,还有下面一个原因。如果是下面这个原因,那么就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先创建的。
       
   
}




_________________
百度网盘 2048G容量 大放送!
百度网盘资源论坛一键保存资源!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译