解决了一个数组分配问题,顺便说说创建动态二维数组

软件和网站开发以及相关技术探讨
回复
头像
flwwater
帖子: 759
注册时间: 2010-10-31 9:15
系统: kubuntu 24.04

解决了一个数组分配问题,顺便说说创建动态二维数组

#1

帖子 flwwater » 2015-11-18 20:20

可能有人碰到过这样的事:在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先创建的。
        
    
}


个人收藏的数百个精美动态壁纸:
https://url17.ctfile.com/d/15983117-593 ... 768?p=6220
(访问密码:6220


个人收藏的经典国语音乐和纯音乐(钢琴,笛子,二胡等):
https://url17.ctfile.com/d/15983117-446 ... 33e?p=6220
(访问密码:6220



如果访问密码不对,可试试这个密码 566816
回复