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() 関数はメモリを再割り当てします。
    以前に割り当てられたポインターと新しいメモリ サイズの 2 つの引数を受け取り、以前に割り当てられたメモリ ブロックのサイズを変更します。調整が成功した場合は、再割り当てされたメモリへのポインタが返され、それ以外の場合は null ポインタが返されます。
// 分配内存
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() 関数は、ソース メモリ領域からターゲット メモリ領域にデータをコピーします。これは、ターゲット メモリ領域へのポインタ、ソース メモリ領域へのポインタ、およびコピーされるデータのサイズ (バイト単位) の 3 つのパラメータを受け入れます。

  • memmove() 関数は memcpy() 関数に似ていますが、重複するメモリ領域を処理できます。これは、ターゲット メモリ領域へのポインタ、ソース メモリ領域へのポインタ、およびコピーされるデータのサイズ (バイト単位) の 3 つのパラメータを受け入れます。

 

コマンドラインパラメータ

  • 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言語プログラミング—型変換とエラー処理

おすすめ

転載: blog.csdn.net/weixin_45228198/article/details/131876516