求解决内存不够用问题

wj709830140 2012-04-17 12:51:05
想开一个二维数组 A[N][N] 来储存数据,但N是未知的,需要在程序运行中读取;
因此想到用 A = ( int * )calloc( ( N*N ) , sizeof( int ) ) ; 来储存。 但这么做会导致有时候内存不够用,怎么解决呢?
另外:A = ( int * )calloc( N , sizeof( int ) ) ;基本够用的。
...全文
186 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
evencoming 2012-04-17
  • 打赏
  • 举报
回复
int **p=(int **)malloc(N*sizeof(int*));
int i;
for(i=0;i<N;i++)
{
p[i]=(int *)malloc(N*sizeof(int));
}
然后可以当作普通的二维数组使用。 p[i][j]这样
muyi66 2012-04-17
  • 打赏
  • 举报
回复
将数组A声明为一个全局数组。
godmmx 2012-04-17
  • 打赏
  • 举报
回复
用链表啊用链表
wj709830140 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
int **p=(int **)malloc(N*sizeof(int*));
int i;
for(i=0;i<N;i++)
{
p[i]=(int *)malloc(N*sizeof(int));
}
然后可以当作普通的二维数组使用。 p[i][j]这样
[/Quote]
你的回答对我这种菜鸟级选手很实用,但我用了好像没有解决问题呢。因为这样做同样需要N*N*2的空间啊。谢谢各位!
liangbch 2012-04-17
  • 打赏
  • 举报
回复
关于《求解决内存不够用问题》,可采用内存映射文件技术来解决。具体细节请参阅百度百科内存映射文件
wj709830140 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 6 楼 的回复:
定义动态数组可以这么做:

比如定义一个二维数组p,各维分别如下:p[2,5]

那就这么写:


C/C++ code

int (*p)[5]; // 声明一个指向动态整型二维数组的指针。
p=(int(*)[5])malloc(sizeof(int)*2*5); // 给该数组分配空间。
for (i=0;i<2;++i)
for (j=0;……
[/Quote]
需要定位操作的。
muyi66 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 5 楼 的回复:
3L办法不好,因为没有指明各维大小,不能正常工作的。


N在运行时获取到具体数据,应该可以正常工作吧?但是这个我觉得有一点点问题,如果系统连N*sizeof(int)的连续空间都没有怎么办,而且仔细想了一下还觉得有问题,就是直接像普通二维数组一样使用头指针+偏移量的方法访问会出问题,因为每行之间的空间不连续。
[/Quote]p[i][j]这样的写法能够正确运行的前提是编译器知道第二维有多大,而你没有给出这个数据,编译器也就无从知道。
liangbch 2012-04-17
  • 打赏
  • 举报
回复
比如:为了实现大数运算,若使用下面的链表来存储任意长度的大数,则每1位10进制数需要24字节。

1 char类型表示1位十进制数,定义链表的节点数据结构如下。
struct _node
{
struct _node* pre;
struct _node* next;
char n;
};
当编译器采用默认设置,在通常的32位编译器,这个结构体将占用12字节。但这并不等于说,分配具有1000个节点的链表需要1000*12字节。不要忘记,操作系统或者库函数在从内存池中分配和释放内存时,也需要维护一个链表。实验表明,在VC编译的程序,一个节点总的内存占用量为 sizeof(struct _node) 向上取16的倍数再加8字节。也就是说,采用这种方式表示n位十进制数需要 n*24字节,而采用1个char型数组仅需要n字节。

详情请参阅 http://blog.csdn.net/liangbch/article/details/1562014
liangbch 2012-04-17
  • 打赏
  • 举报
回复
比如:为了实现大数运算,若使用下面的链表来存储任意长度的大数,则每1位10进制数需要24字节。

1 char类型表示1位十进制数,定义链表的节点数据结构如下。
struct _node
{
struct _node* pre;
struct _node* next;
char n;
};
当编译器采用默认设置,在通常的32位编译器,这个结构体将占用12字节。但这并不等于说,分配具有1000个节点的链表需要1000*12字节。不要忘记,操作系统或者库函数在从内存池中分配和释放内存时,也需要维护一个链表。实验表明,在VC编译的程序,一个节点总的内存占用量为 sizeof(struct _node) 向上取16的倍数再加8字节。也就是说,采用这种方式表示n位十进制数需要 n*24字节,而采用1个char型数组仅需要n字节。

详情请参阅 http://blog.csdn.net/liangbch/article/details/1562014
liangbch 2012-04-17
  • 打赏
  • 举报
回复
链表比数组(动态的或者静态的)耗费的空间多很多倍。不过在链表节点中维护指针,操作系统对每一个节点也的分配和释放也需要额外的空间。
godmmx 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
定义动态数组可以这么做:

比如定义一个二维数组p,各维分别如下:p[2,5]

那就这么写:


C/C++ code

int (*p)[5]; // 声明一个指向动态整型二维数组的指针。
p=(int(*)[5])malloc(sizeof(int)*2*5); // 给该数组分配空间。
for (i=0;i<2;++i)
for (j=0;j<……
[/Quote]

其实我觉得应该先问问楼主这样做的目的是什么,如果仅仅是存储然后逐个读出而不需要对个别数据进行定位和操作,个人感觉还是使用链表比较合适。你觉得呢?
godmmx 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
3L办法不好,因为没有指明各维大小,不能正常工作的。
[/Quote]

N在运行时获取到具体数据,应该可以正常工作吧?但是这个我觉得有一点点问题,如果系统连N*sizeof(int)的连续空间都没有怎么办,而且仔细想了一下还觉得有问题,就是直接像普通二维数组一样使用头指针+偏移量的方法访问会出问题,因为每行之间的空间不连续。
muyi66 2012-04-17
  • 打赏
  • 举报
回复
定义动态数组可以这么做:

比如定义一个二维数组p,各维分别如下:p[2,5]

那就这么写:

int (*p)[5];    //  声明一个指向动态整型二维数组的指针。
p=(int(*)[5])malloc(sizeof(int)*2*5); // 给该数组分配空间。
for (i=0;i<2;++i)
for (j=0;j<5;++j)
p[i][j]=i*5+j; // 使用该数组

muyi66 2012-04-17
  • 打赏
  • 举报
回复
3L办法不好,因为没有指明各维大小,不能正常工作的。
godmmx 2012-04-17
  • 打赏
  • 举报
回复
3L办法不错

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧