Pointers 编译器特定指针?

Pointers 编译器特定指针?,pointers,dll,mingw,labwindows,Pointers,Dll,Mingw,Labwindows,在动态链接DLL的函数中使用NI LabWindows应用程序的指针时遇到问题 DLL是使用MingW4.7构建的 据我所知,NI LabWindows使用了一个非常古老的LLVM铿锵ANSI C编译器,具有C89标准和C90扩展 调用特定的DLL函数时,我使用指向结构的指针。问题是,LabWindows应用程序给出的指针指向的内存位置比DLL预期的要早1个字节 因此,到目前为止,我最讨厌的解决方案是: int MyFunction(MyStruct* struct) { char

在动态链接DLL的函数中使用NI LabWindows应用程序的指针时遇到问题

  • DLL是使用MingW4.7构建的
  • 据我所知,NI LabWindows使用了一个非常古老的LLVM铿锵ANSI C编译器,具有C89标准和C90扩展
调用特定的DLL函数时,我使用指向结构的指针。问题是,LabWindows应用程序给出的指针指向的内存位置比DLL预期的要早1个字节

因此,到目前为止,我最讨厌的解决方案是:

int MyFunction(MyStruct* struct) {
    char *ptr = (char*) struct;
    ptr--;
    struct = (MyStruct*) ptr;

    // do stuff

    ptr = (char*) struct;
    ptr++;
    struct = (MyStruct*) ptr;

    return 0;
}
我的问题是:为什么???有没有更复杂的解决方案

我希望指针这样的基本概念在不同的编译器之间不会有所不同,但可能LabWindows使用的概念太旧了

编辑: 解决方案是以编译器的正确方式声明结构,并指定填充和对齐方式。因此,使用这两种编译器的正确结构定义是:

#pragma pack(2)
typedef struct MyStruct{...};

好的,我解决了我的问题!所有这些奇怪行为的原因是记忆管理。对齐和填充是不同的!所以在将我的结构声明为打包后

typedef struct __attribute__(packed) MyStruct{ ...};
问题没有解决,所以我试了一下

typedef struct __attribute__(packed,align(1)) MyStruct{...};
也不是解决方案,因此我为LLVM CLang编译器添加了#pragma包(1)

#pragma pack(1)
typedef struct __attribute__(packed,align(1)) MyStruct{...};
我不知道原因,但LLVM编译器不会遵循pack(1)指令,但最终的解决方案是将其全部更改为双字节对齐,并删除除pragma之外的所有内容:

#pragma pack(2)
typedef struct MyStruct{...};
现在一切都像一个符咒一样运作:-)