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() 함수는 메모리를 동적으로 할당하고 0으로 초기화합니다.
    메모리 블록 수와 각 메모리 블록의 크기(바이트)를 전달하고 할당된 메모리에 대한 포인터를 반환합니다.
// 使用方式类似malloc
char* ptr = (char*)calloc(5, sizeof(char)); //相当于5*sizeof(char)
  • void* realloc() 함수, 메모리를 재할당합니다.
    이전에 할당된 포인터와 새 메모리 크기라는 두 개의 인수를 승인한 다음 이전에 할당된 메모리 블록의 크기를 조정합니다. 조정이 성공하면 재할당된 메모리에 대한 포인터가 반환되고, 그렇지 않으면 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 연산자는 데이터 유형이나 변수의 바이트 크기를 얻습니다.

  • * 포인터 연산자는 포인터가 가리키는 메모리 주소의 값을 얻습니다.

  • & 연산자는 변수의 메모리 주소를 얻습니다.

  • -> 연산자: 포인터로 구조 멤버에 액세스하는 데 사용되며 구문은 포인터->멤버이며 이는 (*포인터).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]); // 表示第一个命令行参数
	}
}

여기에 이미지 설명을 삽입하세요.
 

파이썬이 C를 호출한다

Python을 사용하여 이전 단계에서 C의 기본 함수를 호출하고 매개변수를 전달합니다.

  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