社区
C语言
帖子详情
malloc函数申请内存空间。
AIGPTchina
2012-09-21 09:04:53
动态申请的空间大小是看 内存?
内存有多大就能申请多大的空间?
1、看硬件的什么部件,硬件的物理内存大小?
2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
...全文
444
9
打赏
收藏
malloc函数申请内存空间。
动态申请的空间大小是看 内存? 内存有多大就能申请多大的空间? 1、看硬件的什么部件,硬件的物理内存大小? 2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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]
使用
malloc函数
申请
内存空间
注意事项
使用
malloc函数
申请
内存空间
需要了解:(malloc的原型为:(void *) malloc(int size) ) 1)内存分配给谁? 2)分配多大的内存? 3)是否还有足够内存分配? 4)内存将用来存储什么格式的数据? 5)分配的内...
为什么使用
malloc函数
申请
内存空间
时所返回的指针要强制类型转换
为什么使用
malloc函数
时
申请
函数的的指针要强制类型转换,转换为和定义的数据类型相对应的同类型的指针。
C语言什么情况下需要用malloc来
申请
内存,为什么要
申请
内存?目的是什么?
当对内存区进行操作时,调用相关函数。 数据量小栈够用就不需要。数据量大就用堆空间。 不用malloc的变量声明在栈,是编译器分配的空间。malloc数据在堆区. 函数原型:void *malloc(unsigned int num_bytes)...
动态
申请
内存空间
:C语言中的
malloc函数
动态
申请
内存空间
可以为我们在实际编程中带来很大的灵活性,使我们能够动态地存储变量的数据。通过使用malloccallocrealloc和free等函数,我们可以在堆区动态地
申请
和释放
内存空间
,使得内存的使用更加高效和灵活。
为什么要用malloc
申请
空间
返回值是void指针,void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指
申请
内存空间
时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型),可以通过类型...
C语言
70,026
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章