内存管理
- 内存管理包含头文件<malloc.h> 或者<stdlib.h>
- void *malloc() 函数,动态分配内存。指定内存大小(以字节为单位),返回一个指向分配内存的指针。
void * 未确定类型的指针。C、C++ 规定 void * 类型可以强制转换为任何其它类型的指针。
// 动态分配内存 4bytes
int* ptr = (int*)malloc(sizeof(int)); //动态数组只能存储一个整数? No,可以自动动态扩展
// 动态分配内存,可以赋值任意大小的数据(自动扩展)
for (int i = 0; i < 5; i++) {
ptr[i] = i; // 自动扩展
}
for (int i = 0; i < 5; i++) {
//输出动态数组的元素
printf("数组的每个值:%d\n", ptr[i]);
}
- void free() 函数,释放内存。
// 释放内存
free(ptr)
- void* calloc() 函数,动态分配内存,并将其初始化为零。
传参内存块数和每个内存块的大小(字节单位),并返回一个指向分配内存的指针。
// 使用方式类似malloc
char* ptr = (char*)calloc(5, sizeof(char)); //相当于5*sizeof(char)
- void* realloc() 函数,重新分配内存。
接受两个参数,即一个之前分配的指针和一个新的内存大小,然后重新调整先前分配的内存块的大小。如果调整成功,返回一个指向重新分配内存的指针,否则返回一个空指针。
// 分配内存
int* ptr = (int*)malloc(5 * sizeof(int)); //整型的动态数组
//为ptr(指针)动态数组 重新分配内存
ptr = (int*) realloc(ptr, 30 * sizeof(int));
if(ptr){
//重新分配成功;
}
存储任意大小的数据:
char* ptr = (char*)malloc(3 * sizeof(char));
// 动态分配内存的指针,只能向其 拷贝 字符串数据;不能直接赋值
strcpy(ptr, "jack"); // (动态分配的内存)可以给任意大小的数据
strcat(ptr, " tom is cat after jack"); // 拼接
printf("result: %s\n", ptr);
-
sizeof 运算符,获取数据类型或变量的字节大小。
-
* 指针运算符,获取指针所指向的内存地址的值。
-
& 运算符,获取变量的内存地址。
-
-> 运算符:用于指针访问结构体成员,语法为 pointer->member,等价于 (*pointer).member。
-
memcpy() 函数,从源内存区域复制数据到目标内存区域。它接受三个参数,即目标内存区域的指针、源内存区域的指针和要复制的数据大小(字节单位)。
-
memmove() 函数,类似于 memcpy() 函数,但它可以处理重叠的内存区域。它接受三个参数,即目标内存区域的指针、源内存区域的指针和要复制的数据大小(字节单位)。
命令行参数
- lauf.exe param1 param2
param1 param2 就是命令行参数; - 命令行的参数及lauf.exe可执行文件名 一起(以字符串形式)传给
main函数
; - int main(int num, char* argv[ ]) ;
num表示接收的参数个数;
argv接收的参数名 指针数组;
int main(int num, char* argv[]){
// num 表示收到的参数的个数
if(num == 1){
printf("没有其他参数:%s\n", argv[0]); // 只有一个可执行文件名
}else if(num == 2){
printf("一个命令参数:%s\n", argv[1]); // 表示第一个命令行参数
}
}
python调用C
使用python调用上一步的C中的main函数,并传递参数;
- 编译C程序为(共享的)动态连接库;
gcc -fPIC lauf.c -shared -o lauf.dll
会生成一个lauf.dll 动态链接库
- python中调用lauf.dll
from ctypes import c_int, c_char_p, windll
# 加载dll
c_module = windll.LoadLibrary("lauf.dll")
# 声明参数类型
c_module.main.argtypes = [c_int, c_char_p*3]
# 声明结果类型
c_module.main.restype = c_int
# 准备数据
num = c_int(2)
arr = c_char_p * 2 # 得到类型
# 类型实例化
arr_obj = arr() # 两个字符指针组成的数组对象
arr_obj[0] = c_char_p(b"param1")
arr_obj[1] = c_char_p(b"param2")
# 调用函数
c_module.main(num, arr_obj)
[上一篇]:C语言编程—类型转换和错误处理