社区
C语言
帖子详情
malloc函数申请内存空间。
AIGPTchina
2012-09-21 09:04:53
动态申请的空间大小是看 内存?
内存有多大就能申请多大的空间?
1、看硬件的什么部件,硬件的物理内存大小?
2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
...全文
421
9
打赏
收藏
malloc函数申请内存空间。
动态申请的空间大小是看 内存? 内存有多大就能申请多大的空间? 1、看硬件的什么部件,硬件的物理内存大小? 2、 我在一个函数里申请4196字节的动态指针就死机了。请问这个是谁来控制的,大小又是谁来控制的?一个函数可以申请多大的动态指针空间?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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函数
动态
申请
内存空间
可以为我们在实际编程中带来很大的灵活性,使我们能够动态地存储变量的数据。通过使用malloccallocrealloc和free等函数,我们可以在堆区动态地
申请
和释放
内存空间
,使得内存的使用更加高效和灵活。
使用
malloc函数
分配内存
使用
malloc函数
分配内存
malloc函数
内存什么地方
申请
空间
https://zhidao.baidu.com/question/477779079.html 内存分为堆区,栈区,静态区,代码区。 全局变量和静态变量存放在静态区,局部变量存在在栈区,动态
申请
的变量(即new,
malloc函数
申请
的变量)存放在堆区。 ...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章