Python CTypes : 초기화 C_CHAR_P ()
-
18-09-2019 - |
문제
내 문제를 설명하기 위해 간단한 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
버퍼 오버플로를 요구하고 있습니다
제휴하지 않습니다 StackOverflow