Tx.Yang 2019-04-15 02:29 采纳率: 66.7%
浏览 563
已结题

python通过swig实现的C语言接口传递指针时是如何工作的?

我最近在尝试使用swig生成一个c语言项目的python接口,但是碰到一些指针传递的问题。以下是我的代码:

// swig_test.c
POINT *test() {
    POINT point; 
    point.x = 5;
    point.y = 2;
    //int r = point.x%point.y;
    printf("test\n");
    printf("point.x: %d, %d\n", point.x, &(point.x));
    printf("point.y: %d\n", point.y);
    printf("&point: %d\n\n", &point);
    return &point;
}

int test2(POINT *p)
{
    POINT point = *p;
    printf("p: %d, %d, %d\n", p, (*p).x, (*p).y);

    printf("test2\n");
    printf("point.x: %d, %d\n", (*p).x, point.x);
    printf("point.y: %d, %d\n", (*p).y, point.y);
    printf("point.x: %d\n", point.x);
    printf("point.y: %d\n", point.y);
    int r = 1; //point.x% point.y;
    return r;
}

int main()
{
    POINT *p = test();
    int r = test2(p);
    printf("%d", r);
}

// swig_test.h
#include <stdio.h>
#include <string.h>

struct POINT;
typedef struct POINT POINT;

struct POINT
{
    unsigned int x;
    unsigned int y;
};

POINT *test();
int test2(POINT *p);

// swig_test.i
 %module swig_test
 %{
 /* Put header files here or function declarations like below */
 #include "swig_test.h"
 extern POINT *test();
 extern int test2(POINT *p);
 %}

 %include "swig_test.h"
 extern POINT* test();
 extern int test2(POINT* p);

// main.py
import _swig_test as module
global point 
point = module.test()
print(module.test2(point))

当我只运行C的可执行文件版本时,输出是正确的:

test
point.x: 5, 2012281584
point.y: 2
&point: 2012281584

p: 2012281584, 5, 2
test2
point.x: 2012274424, 5
point.y: 0, 2
point.x: 5
point.y: 2
1

但是当我生成了pyd动态库并链接进python,指针传递进test2后所指向的值就发生了变化:

test
point.x: 5, 666825456
point.y: 2
&point: 666825456

p: 666825456, 666825496, 119
test2
point.x: 666825496, 666825496
point.y: 119, 119
point.x: 666825496
point.y: 119
1

由命令行可见,被传递的指针本身没有变化,但是所指向的值变了,请问这是为什么?难道python在结束test之后,所有变量已经都被释放了?

  • 写回答

2条回答 默认 最新

  • dabocaiqq 2019-04-15 10:27
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 SQL server表计算问题
  • ¥15 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出