c语言数组malloc
‘壹’ 谁能解释下malloc在c语言中的用法
malloc申请的空间是在"堆"上的
平时我们都是用声明变量来申请空间的,此时申请到的空间是"栈"上的
栈上的空间, 不需要程序员负责释放.
例如,在以下函数中
int go() {
int a;
int b[50];
}
在运行到go里面时, 申请了4个字节(int类型是4个字节)的空间来放变量a, 4*50=200个字节的空间来放变量数组b
在调用go时
// ...
go();
// ...
在运行到go()函数的里部,会申请相应的空间,但在退出go()以后,这些空间就会被废弃.
这在有些时候不能够满足我们的需求,因而就要用到malloc和free
malloc申请的空间,要由我们程序员来负责释放
int go() {
int* a;
a = malloc(sizeof(int));
}
这样就在堆上申请到了4个字节的空间了(sizeof(int)能够得到int的大小, 返回4).
我们还可以
int* a;
a = malloc(100 * sizeof(int))
来申请到100个int的空间.
退出go以后,空间不会释放.所以要用free来释放.
‘贰’ c语言:怎样用malloc函数动态分配二维数组,使之可输入数组的行数和每行的列数。
这个是可以的,但是和其他网友说的一样,内存是线性的,当你在语言中分配一个多维数组的时候,编译器其实也是分配线性内存的,但是我们可以通过模拟来实现类似数组的操作,下面演示一个分配以及操作数组的实例(列数要固定,这里假设列数为4):
int _tmain(int argc, _TCHAR* argv[])
{
int (*p)[4] = (int (*)[4])0;
int row = 3;
int (*mem)[4] = (int (*)[4])0; // 定义数组首指针
mem = (int (*)[4])malloc(sizeof(int(*)[4]) * row); // 分配row行, 4列的数组
// 分别为二维数组的第一维各个元素赋值。
mem[0][0] = 1;
mem[0][1] = 2;
mem[0][2] = 3;
mem[0][3] = 4;
// 打印二维数组的各个元素的值
printf("%d, %d, %d, %d", mem[0][0], mem[0][1], mem[0][2], mem[0][3]);
free(mem);
return 0;
}
不过这里列数必须指定,还有一种方法,这种方法可以保证用户输入任意行或列,而不必要将列数定死,演示如下:
int getElement(int* arr, int colNum, int row, int col);
void setElement(int* arr, int colNum, int row, int col, int val);
int _tmain(int argc, _TCHAR* argv[])
{
int *arr = (int*)0;
int row = 3;
int col = 5;
//分配 row 行 col 列的整形数组
arr = (int*)malloc(sizeof(int) * col * row);
// 将最后一个元素值设置为100
setElement(arr, col, 2, 4, 100);
//输出最后一个元素的值
printf("%d", getElement(arr, col, 2, 4));
free(arr);
return 0;
}
//各个参数说明如下:
//arr: 数组首地址
//colNum:数组列数
//row: 要取得的元素所在行
//col: 要取得的元素所在列
int getElement(int* arr, int colNum, int row, int col)
{
return *(arr + sizeof(int) * (row - 1) * colNum + col);
}
// 此函数用来设置指定行和列的元素的值:
//arr: 数组首地址
//colNum:数组列数
//row: 要取得的元素所在行
//col: 要取得的元素所在列
//val: 要设置的值
void setElement(int* arr, int colNum, int row, int col, int val)
{
*(arr + sizeof(int) * (row - 1) * colNum + col) = val;
}
其实归根到底,还是对指针的操作,希望可以帮到你,呵呵。
‘叁’ C语言中的malloc函数用法>
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes)。
参数:num_bytes 是无符号整型,用于表示分配的字节数。
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实现malloc的方法:
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
‘肆’ 在C语言中如何使用malloc动态申请一维数组
malloc()函数用来动态地分配内存空间,其原型为:void*malloc(size_tsize);
描述:
(参数描述)
Size是以字节为单位分配的内存空间量。
【功能描述】
Malloc()在堆中分配指定大小的内存空间来保存数据。函数执行后,此内存空间未初始化,且其值未知。如果希望在分配内存的同时进行初始化,可以使用calloc()函数。
(返回值)
分配成功时返回指向内存的地址,失败时返回NULL。
操作:
由于在请求内存空间时,可能有内存空间,也可能没有内存空间,所以在继续之前,您需要自己决定应用程序是否成功。
如果size的值为0,返回值可能为NULL,也可能不为NULL,这取决于标准库实现,但是不应该再次引用返回的指针。
注意:函数的返回值类型为void*,Void并不意味着没有返回值或空指针,而是返回的指针类型未知。所以当你使用malloc()时,你通常需要将void指针转换成你想要的类型,例如:
# include < stdlib。H >
TypedefintListData;
ListData*数据;//存储空间的基本地址
Data=(ListData*)malloc(100*sizeof(ListData));
(4)c语言数组malloc扩展阅读:
实现malloc的方法:
(1)数据结构
首先,我们要确保数据结构。一个简单可行的解决方案是将堆内存空间组织成块,每个块由一个元区域和一个数据区域组成,元区域记录关于数据块的元数据(数据区域大小、空闲标志位、指针等)。
数据区域是实际分配的内存区域,数据区域的第一个字节地址是malloc返回的地址。
(2)找到正确的街区
现在考虑如何在区块链中找到合适的区块。一般来说,有两种搜索算法:
Firstfit:从头开始,使用第一个大于所需大小的数据块称为已分配的块
最佳匹配:从头开始遍历所有块,使用数据区域大小大于大小且分配的块的差异最小的块
最适合的有一个高的有效载荷和第一个适合有一个高的操作效率。这里我们使用第一个fit算法。
(3)创建一个新的块如果现有的块都不能满足size的要求,则需要在列表的末尾创建一个新的块。
(4)分块先拼装有一个致命的缺点,那就是它可能允许较小的尺寸占据一个较大的块。在这种情况下,为了改进有效负载,当剩余的数据区域足够大时,应该将其划分为一个新的块。
(5)malloc的实现
通过上面的代码,我们可以实现一个简单的malloc。注意,首先我们需要定义链表的第一个块,first_block,初始化为NULL;此外,我们需要至少剩下的空间BLOCK_SIZE+8来执行除法操作
因为我们需要malloc分配数据区域在8字节处对齐,所以大小不适用于8个倍数,所以我们需要调整大小,使其大于8的最小倍数的大小。