ctypes从c函数返回一个字符串

发布于 2021-01-29 17:23:24

我是Python的资深人士,但对C的涉猎还很少。半天没在网上找到对我有用的任何东西之后,我想我会在这里问问题并获得所需的帮助。

我想做的是编写一个简单的C函数,该函数接受一个字符串并返回另一个字符串。我打算将此功能绑定到多种语言(Java,Obj-C,Python等)中,所以我认为它必须是纯C语言?

到目前为止,这就是我所拥有的。请注意,尝试在Python中检索值时遇到段错误。

你好ç

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

const char* hello(char* name) {
    static char greeting[100] = "Hello, ";
    strcat(greeting, name);
    strcat(greeting, "!\n");
    printf("%s\n", greeting);
    return greeting;
}

main.py

import ctypes
hello = ctypes.cdll.LoadLibrary('./hello.so')
name = "Frank"
c_name = ctypes.c_char_p(name)
foo = hello.hello(c_name)
print c_name.value # this comes back fine
print ctypes.c_char_p(foo).value # segfault

我已经读到段错误是由C释放最初为返回的字符串分配的内存引起的。也许我只是在吠错一棵树?

完成我想要的东西的正确方法是什么?

关注者
0
被浏览
162
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在hello.c中,您将返回一个本地数组。您必须返回一个指向数组的指针,该数组必须使用malloc动态分配。

    char* hello(char* name)
    { 
        char hello[] = "Hello ";
        char excla[] = "!\n";
        char *greeting = malloc ( sizeof(char) * ( strlen(name) + strlen(hello) + strlen(excla) + 1 ) );
        if( greeting == NULL) exit(1);
        strcpy( greeting , hello);
        strcat(greeting, name);
        strcat(greeting, excla);
        return greeting;
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看