C语言中内存是由指针来管理的。指针是一个变量,存储着一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数,字符,浮点数和数组等等。
主要我们要学习一些函数和运算符,来对内存进行分配,释放,移动和复制。
主要有三个函数方法
- malloc(int num)
- 在堆区分配一块指定大小的内存空间,用来存放数据。这块空间在函数执行完成后不会被初始化
-与 *calloc(int num , int size) 类似,calloc多一步,就是将每个字节都初始化为0。
- 相当于
p = malloc(); memset(p,0,size);多了一步,因此malloc更高效且更常用。
- 相当于
- 在堆区分配一块指定大小的内存空间,用来存放数据。这块空间在函数执行完成后不会被初始化
-与 *calloc(int num , int size) 类似,calloc多一步,就是将每个字节都初始化为0。
- free(void *address)
- 释放 address 指向的内存块,释放的是动态分配的内存空间
- *realloc(void *address , int newsize);
- 重新分配内存,将内存扩展到 newsize
仍然是写一个示例来理解一下:
#include<stdlib.h>
int malloc_realloc_demo()
{
char namenes[100];
char *desrciption;
strcpy_s(namenes,20, "Zai Li");
desrciption = (char *)malloc(30 * sizeof(char));
if (desrciption == NULL)
{
fprintf(stderr, "Error - unable to ....\n");
}
else
{
strcpy_s(desrciption,20, "Zai Li a DPS ....");
}
printf("name = %s\n", namenes);
printf("Desrciption: %s\n", desrciption);
desrciption = (char*)realloc(desrciption, 100 * sizeof(char));
if (desrciption == NULL)
{
fprintf(stderr, "Error - unable to ....\n");
}
else
{
strcpy_s(desrciption, 255, "She is in class 10th");
}
printf("name = %s\n", namenes);
printf("Desrciption: %s\n", desrciption);
free(desrciption);
}
在测试期间发现几点问题:
- 要引用头文件
#include<stdlib.h>- 引用头文件之后,发现代码中有函数 Max ,与stdlib头文件中函数冲突,因此需要改掉
- strcpy方法不安全,添加_s,在两字符中添加字符长度
- 陆续发现很多关于内存溢出的问题。在复制,追加,写入一定要注意内存问题。如果小于的话就会报错,当然也可以使用更改后的安全函数 例如 strcpy - strncpy 。方法会更正溢出问题,但是也会截断所需字符。
- 一定要记得及时释放内存。
在代码执行阶段通过命令行传值给C程序。这些值叫做命令行参数。
主要用来解决想从外部控制程序,而不是代码对这些值进行硬编码。
经过查阅发现主要是在linux系统中需要使用,在学习C语言阶段暂时先不具体学习。因此暂且搁置。但是简单的看了一眼与方法传参类似。