仅限OSX上的ctypes段错误

时间:2013-02-18 20:02:22

标签: python c segmentation-fault ctypes language-binding

我使用ctypes在Python中创建了一个非常简单的C库绑定。它只是接受一个字符串并返回一个字符串。

我在Ubuntu上进行了开发,一切都很好。不幸的是,在OSX上完全相同的代码失败了。我完全难过了。

我把一个最小的案例放在一起,显示我遇到的问题。

main.py

import ctypes

# Compile for:
#   Linux: `gcc -fPIC -shared hello.c -o hello.so`
#   OSX:   `gcc -shared hello.c -o hello.so`
lib = ctypes.cdll.LoadLibrary('./hello.so')

# Call the library
ptr = lib.hello("Frank")
data = ctypes.c_char_p(ptr).value # segfault here on OSX only
lib.free_response(ptr)

# Prove it worked
print data

的hello.c

#include <stdlib.h>
#include <string.h>

// This is the actual binding call.
char* hello(char* name) {
    char* response = malloc(sizeof(char) * 100);
    strcpy(response, "Hello, ");
    strcat(response, name);
    strcat(response, "!\n");
    return response;
}

// This frees the response memory and must be called by the binding.
void free_response(char *ptr) { free(ptr); }

1 个答案:

答案 0 :(得分:4)

您应该指定函数的返回类型。具体而言,将其声明为ctypes.POINTER(ctypes.c_char)

import ctypes

lib = ctypes.CDLL('./hello.so')    
lib.hello.restype = ctypes.POINTER(ctypes.c_char)

ptr = lib.hello("Frank")
print repr(ctypes.cast(ptr, ctypes.c_char_p).value)
lib.free_response(ptr)