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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站