malloc对内存有限制么,请帮忙修改一个程序

diana_cherry 2013-01-07 05:42:12
如下程序,分配了12288次就执行不了,机器的内存有几十G,这是怎么回事


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ARTICLE_S 12782
#define WORD_S 17547
int num_of_ulong(unsigned long i);
void error_and_die(const char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
//unsigned long v[WORD_S][ARTICLE_S];

int main(void){
unsigned long word,article;
unsigned long part,position;
unsigned long t;
unsigned long i,j,k;

unsigned long *v[ARTICLE_S];
for(i=0lu;i<WORD_S;i++){
v[i]=(unsigned long *)malloc(ARTICLE_S*sizeof(unsigned long));
printf("succ\n");
}
/**
* ......
}*/
for(i=0lu;i<WORD_S;i++){
free(v[i]);
}
}
...全文
459 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
iceheart 2013-01-08
  • 打赏
  • 举报
回复
引用 10 楼 diana_cherry 的回复:
引用 9 楼 iceheart 的回复:先不谈你的栈溢出,你是如何确定分配了12288次的? printf("succ\n"); 输出了12288次
什么系统,什么编译器?怎么数的?数出来的不一定靠谱,用变量计数,打印结果
ForestDB 2013-01-08
  • 打赏
  • 举报
回复
假定long为8byte,也分配的差不多有1G内存了。 请LZ提供OS,CPU位数,编译器信息,sizeof long,对了,最好检查malloc的返回值而不是统计succ的次数。
孤独小剑 2013-01-08
  • 打赏
  • 举报
回复
引用 12 楼 FancyMouse 的回复:
引用 6 楼 diana_cherry 的回复:引用 5 楼 tianweishuiguo 的回复:C/C++ code?12345 unsigned long *v[ARTICLE_S]; for(i=0lu;i<WORD_S;i++){//这有问题,数组长度为ARTICLE_S,你却用了WORD_S v[i]=(unsigned long *)m……
如果确定是12288(数组大小为12782)次就执行不了,说明还未越界就遇到其他问题挂了。 建议楼主提供更多信息,系统、编译器版本等。
majia2011 2013-01-08
  • 打赏
  • 举报
回复
估计你是在64位的机器上,编译32位的程序,然后............... 好好看操作系统,否则你对不起这么好的计算机,呵呵呵
FancyMouse 2013-01-08
  • 打赏
  • 举报
回复
引用 6 楼 diana_cherry 的回复:
引用 5 楼 tianweishuiguo 的回复:C/C++ code?12345 unsigned long *v[ARTICLE_S]; for(i=0lu;i<WORD_S;i++){//这有问题,数组长度为ARTICLE_S,你却用了WORD_S v[i]=(unsigned long *)malloc(ARTICLE_S*sizeof(u……
你仔细看他在说什么。他说的没错。
ok1411 2013-01-08
  • 打赏
  • 举报
回复
分配了1G多, 能用的分配完了吧?
diana_cherry 2013-01-08
  • 打赏
  • 举报
回复
引用 9 楼 iceheart 的回复:
先不谈你的栈溢出,你是如何确定分配了12288次的?
printf("succ\n"); 输出了12288次
diana_cherry 2013-01-08
  • 打赏
  • 举报
回复
谢谢大家了 ,我反应太迟钝了
diana_cherry 2013-01-08
  • 打赏
  • 举报
回复
引用 5 楼 tianweishuiguo 的回复:
C/C++ code?12345 unsigned long *v[ARTICLE_S]; for(i=0lu;i<WORD_S;i++){//这有问题,数组长度为ARTICLE_S,你却用了WORD_S v[i]=(unsigned long *)malloc(ARTICLE_S*sizeof(unsigned long)); print……
不好意思,我弄错了,改成这样就好了 unsigned long (*v[WORD_S])[ARTICLE_S]; for(i=0lu;i<WORD_S;i++){ v[i]=(unsigned long (*)[])malloc(ARTICLE_S*sizeof(unsigned long)); }
氰客 2013-01-08
  • 打赏
  • 举报
回复
引用 12 楼 FancyMouse 的回复:
引用 6 楼 diana_cherry 的回复: 引用 5 楼 tianweishuiguo 的回复:C/C++ code?12345 unsigned long *v[ARTICLE_S]; for(i=0lu;i<WORD_S;i++){//这有问题,数组长度为ARTICLE_S,你却用了WORD_S v[i]=(unsigned long *)malloc(ARTIC……
+1 显然数组越界了。楼主你release一下,看看还是不是12288次
赵4老师 2013-01-08
  • 打赏
  • 举报
回复
内存分配成功不代表分配的内存可以成功读写。操作系统的内存管理有可能在真正读写刚分配的内存时才真正在底层实现实际物理内存的映射和分配。
iceheart 2013-01-07
  • 打赏
  • 举报
回复
先不谈你的栈溢出,你是如何确定分配了12288次的?
AnYidan 2013-01-07
  • 打赏
  • 举报
回复
内存是一种稀缺资源
diana_cherry 2013-01-07
  • 打赏
  • 举报
回复
引用 4 楼 whizer 的回复:
首先确认你的物理内存大小,其次确认你的操作系统管理内存的大小(因为即使你的物理内存大于4G,但你是32位操作系统,照样只能管理4G),最后确认你的进程空间大小(操作系统允许进程最大的分配内存量).
最后确认你的进程空间大小(操作系统允许进程最大的分配内存量). 这个怎么看,请具体说说,谢谢
diana_cherry 2013-01-07
  • 打赏
  • 举报
回复
引用 5 楼 tianweishuiguo 的回复:
C/C++ code?12345 unsigned long *v[ARTICLE_S]; for(i=0lu;i<WORD_S;i++){//这有问题,数组长度为ARTICLE_S,你却用了WORD_S v[i]=(unsigned long *)malloc(ARTICLE_S*sizeof(unsigned long)); print……
这是数组指针啊
东大坡居士 2013-01-07
  • 打赏
  • 举报
回复

    unsigned long *v[ARTICLE_S];
    for(i=0lu;i<WORD_S;i++){//这有问题,数组长度为ARTICLE_S,你却用了WORD_S
      v[i]=(unsigned long *)malloc(ARTICLE_S*sizeof(unsigned long));
      printf("succ\n");
    }
whizer 2013-01-07
  • 打赏
  • 举报
回复
首先确认你的物理内存大小,其次确认你的操作系统管理内存的大小(因为即使你的物理内存大于4G,但你是32位操作系统,照样只能管理4G),最后确认你的进程空间大小(操作系统允许进程最大的分配内存量).
季昂 2013-01-07
  • 打赏
  • 举报
回复
问问你的编译器,嘿嘿。
pengfoo 2013-01-07
  • 打赏
  • 举报
回复
malloc 与 free成对使用,不然会造成内存泄露,造成内存耗尽的
pengfoo 2013-01-07
  • 打赏
  • 举报
回复
函数malloc 的原型如下: void * malloc(size_t size); 用malloc 申请一块长度为length 的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。 1、malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。 2、malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。 函数free 的原型如下: void free( void * memblock ); 为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

70,023

社区成员

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

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