C语言编程中分配内存空间的相关函数_C 语言

C语言malloc()函数:动态分配内存空间
头文件:

#include <stdlib.h>

malloc() 函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存分配及变量存储类别),其原型为:

void* malloc (size_t size);

【参数说明】size 为需要分配的内存空间的大小,以字节(Byte)计。

【函数说明】malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc() 函数。

【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。

由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。

如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。

注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

char *ptr = (char *)malloc(10); // 分配10个字节的内存空间,用来存放字符

动态内存分配举例:

#include <stdio.h> /* printf, scanf, NULL */
#include <stdlib.h> /* malloc, free, rand, system */
int main ()
{
 int i,n;
 char * buffer;
 printf ("输入字符串的长度:");
 scanf ("%d", &i);
 buffer = (char*)malloc(i+1); // 字符串最后包含 \0
 if(buffer==NULL) exit(1); // 判断是否分配成功
 // 随机生成字符串
 for(n=0; n<i; n++)
  buffer[n] = rand()%26+'a';
 buffer[i]='\0';
 printf ("随机生成的字符串为:%s\n",buffer);
 free(buffer); // 释放内存空间
 system("pause");
 return 0;
}

运行结果:

输入字符串的长度:20
随机生成的字符串为:phqghumeaylnlfdxfirc

C语言calloc()函数:分配内存空间并初始化
头文件:

#include <stdlib.h>

calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:

 void* calloc (size_t num, size_t size);

calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。

【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。

如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。

注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 calloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

char *ptr = (char *)calloc(10, 10); // 分配100个字节的内存空间

calloc() 与 malloc() 的一个重要区别是:calloc() 在动态分配完内存后,自动初始化该内存空间为零,而 malloc() 不初始化,里边数据是未知的垃圾数据。下面的两种写法是等价的:

// calloc() 分配内存空间并初始化
char *str1 = (char *)calloc(10, 2);
// malloc() 分配内存空间并用 memset() 初始化
char *str2 = (char *)malloc(20);
memset(str2, 0, 20);

代码示例:

#include <stdio.h>
#include <stdlib.h>
int main ()
{
 int i,n;
 int * pData;
 printf ("要输入的数字的数目:");
 scanf ("%d",&i);
 pData = (int*) calloc (i,sizeof(int));
 if (pData==NULL) exit (1);
 for (n=0;n<i;n++)
 {
  printf ("请输入数字 #%d:",n+1);
  scanf ("%d",&pData[n]);
 }
 printf ("你输入的数字为:");
 for (n=0;n<i;n++) printf ("%d ",pData[n]);

 free (pData);
 system("pause");
 return 0;
}

运行结果:

要输入的数字的数目:4
请输入数字 #1:126
请输入数字 #2:343
请输入数字 #3:45
请输入数字 #4:234
你输入的数字为:126 343 45 234

上面的程序会将你输入的数字存储起来,然后输出。因为在程序运行时根据你的需要来动态分配内存,所以每次运行程序你可以输入不同数目的数字。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
内存分配
c语言内存分配、c语言动态分配内存、c语言分配内存函数、c语言结构体内存分配、c语言数组内存分配,以便于您获取更多的相关知识。

时间: 2024-07-31 18:32:14

C语言编程中分配内存空间的相关函数_C 语言的相关文章

在C语言编程中使用变量的基础教程_C 语言

C语言在明面上将数的变量分为两类,整型变量以及浮点数,对应着现实世界的整数和小数. 首先是整数,使用了这么多的C语言之后,每当在使用整数之时都会将其想象成二进制的存在,而不是十进制.原因在于,这是程序的本质所在,稍有研究编译器工作原理的都会发现,在编译器处理乘法乃至除法的时候,优秀的编译器总会想方设法的加快程序的速度,毫无疑问在所有运算中移位运算是最快速的"乘法"以及"除法": 1<<2 == 4 ,8>>2 == 2 而正常一个乘法相当于十

C语言编程中函数的基本学习教程_C 语言

C 语言中的函数等价于 Fortran 语言中的子程序或函数,也等价于 Pascal 语言中的过程或函数.函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑它是如何实现的.使用设计正确的函数,程序员无需考虑功能是如何实现的,而只需知道它具有哪些功能就够了.在 C 语言中可以简单.方便.高效地使用函数.我们经常会看到在定义后仅调用了一次的短函数,这样做可以使代码段更清晰易读. 到目前为止,我们所使用的函数(如 printf.getchar 和 putchar 等)都是函数库中提供的函数

C语言编程中生成随机数的入门教程_C 语言

语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗? 几个概念 随机数:数学上产生的都是伪随机数,真正的随机数使用物理方法产生的. 随机数种子:随机数的产生是由算术规则产生的,srand(seed)的随机数种子不同,rand()的随机数值就不同,倘若每次的随机数种子一样,则rand()的值就一样.所以要产生随机数,则srand(seed)的随机数种子必须也要随机的. 用srand()产生随机数种子

讲解C语言编程中指针赋值的入门实例_C 语言

从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它处重新变赋值的.如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值.之后我的程序在其它任何处都不会再去重新对它赋值.那我又应该怎么办呢?用const . /* . . . */ const int ic =20; /* . . . */ ic = 40; /*这样是不可以的,编译时是无

详解C++编程中对于函数的基本使用_C 语言

形式参数和实际参数 在调用函数时,大多数情况下,函数是带参数的.主调函数和被调用函数之间有数据传递关系.前面已提到:在定义函数时函数名后面括号中的变量名称为形式参数(formal parameter,简称形参),在主调函数中调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为实际参数(actual parameter,简称实参). [例]调用函数时的数据传递. #include <iostream> using namespace std; int max(int x,int y)

详解C++编程中的vector类容器用法_C 语言

vector简介vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了:而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量. vector的扩充机制:按照容器现在容量的一倍进行增长.vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一

基础C语言编程时易犯错误有哪些_C 语言

C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下"灵活的余地",但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误.看着有错的程序,不知该如何改起,通过对C的学习,积累了一些C编程时常犯的错误,以供参考. 1.书写标识符时,忽略了大小写字母的区别. main() { int a=5; printf("%d",A); } 编译程序把a和A认为是两个不同的变量名,而显示出错信息.C认为大写

C语言中获取进程识别码的相关函数_C 语言

C语言getpid()函数:获取进程识别码头文件: #include <unistd.h> 定义函数: pid_t getpid(void); 函数说明:getpid ()用来取得目前进程的进程识别码,许多程序利用取到的此值来建立临时文件, 以避免临时文件相同带来的问题. 返回值:目前进程的进程识别码 范例 #include <unistd.h> main() { printf("pid=%d\n", getpid()); } 执行: pid=1494 /*每次

C++编程中的函数指针初步解析_C 语言

1.定义每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针.2.语法指向函数的指针变量的一般定义形式为: 数据类型 (*指针变量名)(参数表);3.说明1) 函数指针的定义形式中的数据类型是指函数的返回值的类型. 2) 区分下面两个语句: int (*p)(int a, int b); //p是一个指向函数的指针变量,所指函数的返回值类型为整型 int *p(int a, int b); //p是函数名,此函数的返回值类型为整型指针 3) 指向函数的指针变量不是