malloc函数申请内存空间。

AIGPTchina 2012-09-21 09:04:53
动态申请的空间大小是看 内存?
内存有多大就能申请多大的空间?

1、看硬件的什么部件,硬件的物理内存大小?

2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
...全文
421 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoqiaimee 2014-05-22
  • 打赏
  • 举报
回复
同问,我的问题是读取两个txt文件中的二进制码进行矩阵相乘运算,但是将文件中的比特读入内存中(用malloc函数)时,当txt文件的数据量大时运行结果出错,各位大神能不能帮我看看代码? #include<iostream> #include <string> void matrix_multiply(char *m1,char *m2,char *r,int x,int y,int z) { register char k; int i = 0; int result = 0; int row; int column; for(row=0;row<x;row++) for(column=0;column<z;column++) { for(k=0;k<y;k++) //完成相乘 { result += (*(m1 + row*y + k)) * (*(m2 + column*z + k )); } *(r + i) = result; result = 0; i ++; } *(r+i) = 0; } int main() { FILE *fp_in; int k = 0; unsigned long i = 0; long j =0; long n = 0; char *lsBuf = NULL; long length1 = 0; long length2 = 0; long add_size = 0; long file_size = 0; char *lsBuf1 = NULL; char *lsBuf11 = NULL; char *lsBuf2 = NULL; char *lsBuf21 = NULL; char *out = NULL; char *lsFileName1 = NULL; char *lsFileName2 = NULL; void trim(char *str); char *a=0; char *b=0; lsFileName1 = "file1.txt"; lsFileName2 = "file2.txt"; if ( NULL == ( fp_in = fopen(lsFileName1,"r") ) ) { printf( "[%s][%s][%d]文件路径或者文件名不正确!\n", __FILE__, __FUNCTION__, __LINE__ ); return -1; } /*获取文件中的二进制码流*/ fseek( fp_in, 0, SEEK_END ); file_size = ftell( fp_in ); fseek( fp_in, 0, SEEK_SET ); lsBuf1 = (char *)malloc(2* (file_size)*sizeof(char) ); lsBuf11 = (char *)malloc(2* (file_size)*sizeof(char) ); fread( lsBuf1, file_size-1, sizeof(int), fp_in ); trim( lsBuf1 ); if ( NULL == ( fp_in = fopen(lsFileName1,"w") ) ) { printf( "[%s][%s][%d]文件路径或者文件名不正确!\n\n\n",__FILE__, __FUNCTION__, __LINE__ ); return 0; } fwrite(lsBuf1 , strlen(lsBuf1), 1, fp_in ); printf("初始密钥串长度=%d",strlen(lsBuf1)); printf("\n"); for(i = 0; i < strlen(lsBuf1); ++i) { *(lsBuf11 + i) = (*(lsBuf1 + i)) - 48; } for(i = 0; i < strlen(lsBuf1); ++i) { printf("%d ", *(lsBuf11+i)); } printf("\n"); fclose( fp_in ); file_size = 0; lsBuf = NULL; if ( NULL == ( fp_in = fopen(lsFileName2,"r") ) ) { printf( "[%s][%s][%d]文件路径或者文件名不正确!\n", __FILE__, __FUNCTION__, __LINE__ ); return -1; } fseek( fp_in, 0, SEEK_END ); file_size = ftell( fp_in ); fseek( fp_in, 0, SEEK_SET ); lsBuf2 = (char *)malloc( (file_size)*sizeof(char) ); lsBuf21 = (char *)malloc( (file_size)*sizeof(char) ); fread( lsBuf2, file_size-1, sizeof(int), fp_in ); trim( lsBuf2 ); if ( NULL == ( fp_in = fopen(lsFileName2,"w") ) ) { printf( "[%s][%s][%d]文件路径或者文件名不正确!\n\n\n",__FILE__, __FUNCTION__, __LINE__ ); return 0; } fwrite(lsBuf2 , strlen(lsBuf2), 1, fp_in ); printf("随机数个数=%d",strlen(lsBuf2)); printf("\n"); for(i = 0; i < strlen(lsBuf1)*strlen(lsBuf1); ++i) { *(lsBuf21 + i) = (*(lsBuf2 + i)) - 48; } for(i = 0; i < strlen(lsBuf1)*strlen(lsBuf1); ++i) { printf("%d ", *(lsBuf21+i)); } printf("\n"); fclose( fp_in); out = (char *)malloc( (file_size)*sizeof(char) ); matrix_multiply(lsBuf21,lsBuf11,out,strlen(lsBuf1),strlen(lsBuf1),1); for(i = 0; i < strlen(out); ++i) printf("%d ", *(out + i));system("pause"); return 0; } void trim(char *str) { int i=0; int j=0; char *ptr=NULL; ptr=str; for(i=0;(str[i] == '0') || (str[i] == '1') || (str[i] == ' ');i++) { if(str[i]!=' ') { str[j]=str[i]; j++; } } str[j]='\0'; } 这个程序要求文件1中的数据在M量级,如何解决?跪求指点啊!!!!
pathuang68 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

malloc跟程序的堆栈的大小也有关系,你的堆栈都已经满了还怎么申请啊。
[/Quote]

malloc是分配堆上的内存,堆和栈最好不要混为一谈。当然,指针变量本身会在栈上,如果栈已经满了,或许也会出错,但这种概率实在太小了,几乎不会存在这样的情况。

楼主说动态分配4196字节的内存就失败了,这也几乎是不太可能发生的事情。要不把代码贴出来看看?

魔笛手 2012-09-23
  • 打赏
  • 举报
回复
malloc跟程序的堆栈的大小也有关系,你的堆栈都已经满了还怎么申请啊。
LogicTeamLeader 2012-09-22
  • 打赏
  • 举报
回复
那就难说了,嵌入式系统的内存分配我不太清楚,系统提供的内存分配策略需要你自己研究。

[Quote=引用 2 楼 的回复:]
我的设备不是计算机。
[/Quote]
AnYidan 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
我的设备不是计算机。
[/Quote]

???
lyqf365 2012-09-21
  • 打赏
  • 举报
回复
这个东西要从系统和进程上去看的.
就当下常见的x64的windows来看.

系统可以用的内存是 2的64次方字节,但是有一半的内存地址给系统本身用掉了,最低的一小部分用作开发测试用了.比如 0x0000000000000000 地址就不可以写,也不能读
而进程之间,内存是隔开的.
对于一个x64的进程而言,可以申请的内存大约是2的63次方字节.
但是malloc出来的内存真的就实实在在的分配了么?当然不是,只有在这段内存真正被使用时才会真正进入ram.而且是通过内存页的方式加载的.


如果是其它系统的情况,就要看其具体的系统来定了.
如果是祼系统的,那就要看你的malloc函数是如何实现的了.
HAN-Kai 2012-09-21
  • 打赏
  • 举报
回复
对的,主要是由闲置的内存大小所决定的。可能是因为你申请的空间超过你的设备闲置内存容量了。
AIGPTchina 2012-09-21
  • 打赏
  • 举报
回复
我的设备不是计算机。
LogicTeamLeader 2012-09-21
  • 打赏
  • 举报
回复
动态申请的空间大小和两个因素相关,第一是虚拟存储的最大空间,32位系统是4g;第二是跟当时你的计算机中内存消耗情况和内存碎片的情况相关。

申请4196字节的内存绝对不会造成死机,可能是你指针使用错误造成的。

[Quote=引用楼主 的回复:]
动态申请的空间大小是看 内存?
内存有多大就能申请多大的空间?

1、看硬件的什么部件,硬件的物理内存大小?

2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
[/Quote]

69,382

社区成员

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

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