C语言 用malloc()创建动态数组

使用malloc()创建动态数组

因本人才疏学浅,见识浅薄,有不当之处望指正,谢谢!

当我们创建数组时,不允许在程序运行时选择数组的大小和分配内存。如果n是一个整形变量。

double a[n];		// C99以前不允许,n是变量

但是,可以

a = (double *) malloc(n * sizeof(double));		// 允许

关于内存分配。所有程序都必须预留足够多内存储存程序使用的数据。这些内存有的是自动分配。比如,下面声明:

float a;
char words[] = "Let's study the C language!";

为一个float类型的值和一个字符串预留了足够的内存,或者可以显式指定分配一定数量的内存;

int number[100];

该声明预留了100个内存位置,每个位置都用于储存int类型的值。
静态数据在程序载入内存时分配,而自动数据在程序执行块时分配,并在程序离开该块时释放。

C语言可以做更多,可以在程序运行时分配更多的内存。主要是malloc()函数,
malloc()函数原型:

extern void *malloc

该函数接受一个参数:所需的内存字节数。malloc()函数会找到合适的空闲内存块,这样的内存是匿名的。就是说,malloc()分配内存,不会为其赋名。但是,它确实返回动态分配内存块的首字节地址。可以把该地址赋给指针变量,并使用指针访问这块内存。

我们用malloc()创建一个数组。除了用malloc()在程序运行时请求一块内存,还需要一个指针记录这块内存的位置。比如:

double * a;
a = (double *) malloc(30 * sizeof(double));

应该坚持使用强制类型转换,提高代码的可读性。
以上代码为30个double类型的值请求内存空间,并设置a指向该位置。指针a指向一个double类型,不是指向内含30个double类型值的块。

malloc()和free()配套使用
free()将内存归还内存池
malloc()和free()的原型都在stdlib.h头文件中
使用malloc(),程序可以在运行时才确定数组大小。如下:

// dyn_arr -- 动态分配数组
#include <stdio.h>
#include <stdlib.h>			// 为malloc(), free()提供原型

int main(void)
{
	double * a;
	int max;
	int number;
	int i = 0;
	printf("What is the maximum number of type double entries?\n");
	if(scanf("%d", &max) != 1)
	{
		printf("Number not correctly entered -- bye.\n");
		exit(EXIT_FAILURE);
	}
	a = (double *) malloc(max * sizeof(double));
	if(a == NULL)
	{
		printf("Memory allocation failed. Goodbye.\n");
		exit(EXIT_FAILURE);
	}
	// a 现在指向有max个元素的数组
	printf("Enter the values (q to quit):\n");
	while(i < max && scanf("%lf", &a[i]) == 1)
		++i;
	printf("Here are your %d entries:\n", number = i);
	for(i = 0; i < number; i++)
	{
		printf("%7.2f ", a[i]);
		if(i % 7 == 6)
			printf("\n");
	}
	if(i % 7 != 0)
		printf("\n");
	printf("Done.\n");
	free(a);

	return 0;
}

如图:
在这里插入图片描述
输入6个数:
在这里插入图片描述
虽然输入6个数,但是程序也只处理前5个数

  • 27
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值