2017년 2월 15일 수요일

64bit architecture에서의 char* pointer byte size

C#에서 C 기반의 library에서 char**을 가져오려고
계속 시도하는데 죽는 현상이 발생해서 삽질을 하고 있었음.

Interop with Native Libraries: http://www.mono-project.com/docs/advanced/pinvoke/

: https://bytes.com/topic/c-sharp/answers/554501-c-c-interop-returning-char

계속 전달되는 char**의 IntPtr에서 char*를 읽기 위해 4bytes씩 읽어오도록 하고 있었는데..

정말 바보 같았다. malloc, memset에서도 sizeof를 그렇게 줄창 쓰면서도
왜!!! 바보같이 4bytes 읽어 왔었는지 급 한심스러워짐..

일단 MS에서도 아래와 같이 가이드를 주고 있음.

하지만 Marshal.SizeOf(typeof(IntPtr)) 보다는
Marshal.SizeOf<IntPtr>()이 warning이 뜨지 않음.


https://msdn.microsoft.com/ko-kr/library/0t7xwf59(v=vs.110).aspx
다음 예제에서는 읽기 / 쓰기를 사용 하 여 관리 되지 않는 배열 하는 방법의 ReadIntPtr  WriteIntPtr 메서드.
static void ReadWriteIntPtr()
{
    // Allocate unmanaged memory. 
    int elementSize = Marshal.SizeOf(typeof(IntPtr));
    IntPtr unmanagedArray = Marshal.AllocHGlobal(10 * elementSize);

    // Set the 10 elements of the C-style unmanagedArray
    for (int i = 0; i < 10; i++)
    {
        Marshal.WriteIntPtr(unmanagedArray, i * elementSize, ((IntPtr)(i + 1)));
    }
    Console.WriteLine("Unmanaged memory written.");

    Console.WriteLine("Reading unmanaged memory:");
    // Print the 10 elements of the C-style unmanagedArray
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(Marshal.ReadIntPtr(unmanagedArray, i * elementSize));
    }

    Marshal.FreeHGlobal(unmanagedArray);

    Console.WriteLine("Done. Press Enter to continue.");
    Console.ReadLine();
}




댓글 없음:

댓글 쓰기