malloc函数分配空间不连续问题

C语言 码拜 9年前 (2015-10-22) 2168次浏览
本人用一个二级指针给矩阵的元素申请空间:

	M.mat = (float32**)malloc( row*sizeof(float32*) );
	for(i=0;i<row;i++)
		M.mat[i] = (float32*)malloc( col*sizeof(float32) );


但是发现分配的空间并不是连续的,
具体:
每行的元素存储空间是连续的,但是行与行之间并不是连续的,中间间隔着一个随机的数据(相同矩阵该数据相等,不同矩阵该数据是不同的)
例如一个4*5的矩阵
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20
malloc函数分配空间不连续问题
另一个4*5的矩阵
malloc函数分配空间不连续问题
为什么行与行之间的存储空间就不连续呢? 这不是浪费了存储空间吗,或这有其他的什么作用吗?

本人用的是TI的DSP 28335   软件是CCS6.

解决方案:4分
LZ想说两次分配行数据的内存不连续吗?
这是很正常的,内存分配的时候有一些预留的信息保留下来,一般放在申请的内存前面几个字节
还有就是申请的内存要对齐等等
解决方案:4分
想连续用:

M.mat = (float32*)malloc( row*col*sizeof(float32));
for(i=0;i<row;i++) for (j=0;j<col;j++) M.mat[i*col+j] = 0.0;
//...
free(M.mat);
解决方案:4分
堆是一个链表,链表的每个节点本来就是不连续的,需要空间用来存放上一个节点,下一个节点,和当前节点大小等信息,假如你想要连续,你可以本人申请一大块内存,本人去控制维护。
解决方案:4分
两次 malloc 的结果当然不是连续的。
假如要连续,就一次分配:

M.mat = (float32**)malloc( row*sizeof(float32*) );
float32 *buf = (float32 *)malloc(row*col*sizeof(float32));
for(i=0;i<row;i++)
    M.mat[i] = buf + i * col;
解决方案:4分
LINUX 程序设计第四版
P218页
分配两块内存并不会得到一个独立的可以连续寻址的内存块。你得到的是你所要求的:两个独立的内存块

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明malloc函数分配空间不连续问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)