본문 바로가기
C

Python으로 데이터 전달 - sizeof()와 strlen()로 안전한 메모리 관리

by yororing 2024. 9. 2.

00 개요

  • 코드분석 중 C 언어에서 Python으로 데이터를 옮길 때, 문자열을 처리하는 도중 sizeof()와 strlen()을 활용하여 어느 문자열에서 사용 안 하는 공간을 0으로 초기화 시켜주는 것을 보았고 이에 대해 정리하고자 함
  • sizeof()와 strlen() 함수를 활용하여 문자열과 메모리를 안전하게 처리하는 방법에 대한 정리!

01 C에서 Python으로 데이터 전달 - sizeof() 와 strlen()로 메모리 초기화

  • C 언어에서 Python으로 데이터를 전달할 때는 두 언어의 메모리 관리 방식의 차이로 인해 발생할 수 있는 잠재적인 문제들을 미리 방지하는 것 중요
  • sizeof()와 strlen() 함수를 활용하여 문자열과 메모리를 안전하게 처리 가능

1. sizeof()와 strlen()의 차이점

  • sizeof(): 변수나 배열의 전체 크기를 바이트 단위로 반환, 문자열 배열의 경우, Null 종료 문자('\0')를 포함한 전체 메모리 크기를 나타냄
  • strlen(): 문자열의 실제 길이, 즉 Null 종료 문자를 제외한 문자의 수 반환 

2. 메모리 초기화의 중요성

  • C에서 고정 크기의 문자열 배열은 메모리의 일부를 차지함
  • 만약 문자열이 배열 크기보다 짧다면남은 부분에 이전 데이터가 남아 있을 수 있음
  • 이러한 불확실성을 제거하기 위해 문자열이 할당된 배열의 나머지 부분을 0으로 초기화하는 것이 중요함
  • 이는 메모리의 불필요한 데이터 유출을 방지하고 Python과 같은 언어에서 데이터를 안전하게 사용할 수 있도록 함

3. Python으로의 데이터 전달

  • Python에서는 메모리 관리가 자동화되어 있지만, C에서 전달된 데이터가 예상치 못한 메모리 내용을 포함하고 있을 경우 문제 발생 가능
  • 이를 방지하기 위해, sizeof()로 문자열 배열의 전체 크기를 확인하고, strlen()을 사용하여 문자열의 실제 길이를 얻은 후, 나머지 공간을 0으로 채워 Python으로 안전하게 데이터를 전달할 수 있음!

4. 예시

# include <string.h>
# include <Python.h>

PyObject *convert_to_pylist(char *hostloads[], int numLoads) {
    PyObject *result = PyList_New(numLoads);
    int i, j;
    
    for (i = 0; i < numLoads; i++) {
        int size_string = sizeof(hostloads[i]);   // 배열의 크기 (바이트 단위)
        int len_string = strlen(hostloads[i]);    // 문자열의 실제 길이
        
        // 문자열 뒤에 남은 공간을 0으로 초기화
        for (j = len_string; j < size_string; j++)
            hostloads[i][j] = 0;
        
        PyObject *o = PyString_FromString(hostloads[i]);   // Python 문자열 객체로 변환
        PyList_SetItem(result, i, o);             // Python 리스트에 삽입
    }
    
    return result;
}
  • 설명
    • sizeof()로 배열의 크기를 구하고, strlen()으로 실제 문자열 길이 확인
    • 문자열이 저장된 배열에서 남은 공간을 0으로 채워서 메모리를 초기화함
    • Python으로 데이터를 안전하게 전달하기 위해, 변환된 문자열을 Python 리스트에 삽입
    • 이렇게 함으로써 C에서 Python으로 데이터를 전달할 때 발생할 수 있는 메모리 문제를 방지 가능!