질문: C++에서는 다음과 같이 배열을 초기화하기 위해 memset 함수를 사용하는 데 익숙합니다.
int sz = 100; int *a = (int*)malloc(sizeof(int) * sz); memset(a,0,sizeof(a));
PHP가 이 C++ 코드를 호출할 때(url을 사용하여 PHP 함수 호출) memset 함수가 작동하지 않고 배열 a의 메모리가 프로그램에 많은 오류가 있었고 문제 해결 과정에서 이 문제가 발견되었습니다
원인: 근본 원인은 PHP가 C++를 호출할 때 sizeof(a)가 해당 크기를 반환하지 않는다는 것입니다. a가 가리키는 연속 메모리 공간이지만 포인터 자체의 크기만 반환하므로 memset은 적절한 역할을 수행하지 않습니다.
해결책: memeset의 세 번째 매개변수에 sizeof(a) 대신 sizeof(int) * sz를 사용하고 배열의 실제 크기를 매개변수로 전달하면 memset 함수가 작동할 수 있습니다
PHP가 C++ 확장을 호출할 때 C++의 포인터와 관련된 많은 라이브러리 함수에 문제가 있으며 때로는 PHP가 확장을 호출할 때 메모리 관리 메커니즘에 문제가 있어 직접 작성해야 할 수도 있습니다.
저작권 안내: 이 글은 해당 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.
위 내용은 PHP가 C++ 확장을 호출할 때 잘못된 memset/sizeof 함수 문제를 소개하며, 관련 측면도 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.