C语言编程---内存管理和命令行参数

内存管理

  • 内存管理包含头文件<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函数,并传递参数;

  1. 编译C程序为(共享的)动态连接库;
gcc -fPIC lauf.c -shared -o lauf.dll

会生成一个lauf.dll 动态链接库

  1. 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语言编程—类型转换和错误处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值