使用 memset 时 Dll 导致 Python 崩溃

Dll causes Python to crash when using memset

我一直在做一个项目,我试图在 Python 中使用用 C++ 编写的旧 CodeBase 库。我想要的是使用 CodeBase 重新索引具有 .cdx 索引的 .dbf 文件。但目前,Python 在运行时崩溃。更详细的解释将在后面进行。

至于Python,我正在使用ctypes加载dll然​​后执行我自己添加的函数这应该不会造成问题,因为它不使用CodeBase本身的一行代码没有使用。
Python代码:

import ctypes  
cb_interface = ctypes.CDLL("C4DLL.DLL")  
cb_interface.reindex_file("C:\temp\list.dbf")  

这是我添加的 CodeBase 函数,但它需要一些我现在无法提供的知识,而不是把这个问题搞得一团糟。如果有必要,我会尽可能提供进一步的见解:

S4EXPORT int reindex_file(const char* file){
    CODE4 S4PTR *code;
    DATA4 S4PTR *data;

    code4initLow(&code, 0, S4VERSION, sizeof(CODE4));
    data = d4open(code, file);
    d4reindex(data);

    return 1;
}

根据我自己的调试,我的问题发生在code4initLow。当 dll 到达以下代码行时,Python 崩溃并显示 window 说 "python.exe has stopped working":

memset( (void *)c4, 0, sizeof( CODE4 ) ) ;

c4 与前面代码块中的代码是同一个对象。

在运行时尝试更改内存的 dll 是否存在问题?如果我从我的 python 脚本创建一个 .exe 文件,它会不会是一个 python 问题?

如果有人能回答我这些问题 and/or 为我的 python 崩溃问题提供解决方案,我将不胜感激。

最后但同样重要的是,这是我在这里的第一个问题。如果我在这里不小心违反了成文或不成文的规定,我深表歉意并承诺尽快解决。

首先,指针 code 没有指向任何地方,因为它没有被初始化。其次,您实际上并没有尝试填充结构,因为您将 memset 指针 传递给指针

您可能应该做的是将 code 声明为普通结构实例(而不是指针),然后在将其传递给 d4open.[=15 时使用 &code =]

就像 Joachim Pileborg 所说的那样,问题是将空指针传递给 code4initLow。 ("Alternative") 解决方案是为结构 CODE4 S4PTR *code = (CODE4*)malloc(sizeof(CODE4)); 分配内存,然后像 code4initLow(code, 0, S4VERSION, sizeof(CODE4));.

一样传递指针