문제

내 문제를 설명하기 위해 간단한 C ++ 프로그램을 썼습니다.

extern "C"{
    int test(int, char*);
}

int test(int i, char* var){
    if (i == 1){
        strcpy(var,"hi");
    }
    return 1;
}

나는 이것을 SO로 컴파일한다. Python에서 나는 호출합니다.

from ctypes import *

libso = CDLL("Debug/libctypesTest.so")
func = libso.test
func.res_type = c_int

for i in xrange(5):
    charP = c_char_p('bye')
    func(i,charP)
    print charP.value

이것을 실행할 때 내 출력은 다음과 같습니다.

bye
hi
hi
hi
hi

기대했다:

bye
hi
bye
bye
bye

내가 무엇을 놓치고 있습니까?

감사.

도움이 되었습니까?

해결책

문자로 초기화 한 문자열 "bye", 그리고 당신이 계속 복용하고 할당하는 주소 charP, 처음 후에는 다시 시작되지 않습니다.

조언을 따르십시오 여기:

그러나 돌연변이 가능한 메모리에 대한 포인터를 기대하는 기능으로 전달해서는 안됩니다. 변한 메모리 블록이 필요한 경우 CTYPES에는 Create_string_Buffer 기능이있어 다양한 방식으로이를 생성합니다.

"Mutable Memory에 대한 포인터"는 정확히 C 함수가 기대하는 것입니다. 따라서 사용해야합니다. create_string_buffer 문서가 설명하는대로 해당 버퍼를 만들 수 있습니다.

다른 팁

파이썬이 5 패스 모두에 대해 동일한 버퍼를 재사용하고 있다고 생각합니다. "HI"로 설정하면 "Bye"로 다시 설정하지 마십시오.

extern "C"{
    int test(int, char*);
}

int test(int i, char* var){
    if (i == 1){
        strcpy(var,"hi");
    } else {
        strcpy(var, "bye");
    }
    return 1;
}

그러나 조심하세요, strcpy 버퍼 오버플로를 요구하고 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top