Visual Studio版本之间不同的未分配内存行为

Emi*_*dın 5 c++ memory-management compiler-errors visual-studio visual-c++

我有一个奇怪的情况.我正在尝试将10年以上的pci相机设备SDK应用到我的相机管理软件中.Manifacturer不再经营,我没有机会获得官方帮助.我在这里,寻找一些帮助解决我的丑陋问题.

SDK附带Visual Studio 6.0样本.其中一个包含文件的结构以一个字节数组结尾,如下所示;

typedef struct AVData {
    ...  
    BYTE audioVideoData[1];
}AVDATA, *PAVDATA;
Run Code Online (Sandbox Code Playgroud)

但是这个单字节分配的字节数组接收视频帧并且很奇怪,它适用于Visual Studio 6.0版本.如果我使用Visual Studio 2005/2008/2010进行尝试,我会开始收到Memory Access Violation错误消息,因为之后不应该将空间分配给固定大小的数组,不是吗?但是同样的代码在VS 6.0中运行良好?!它可能是由编译器或c ++运行时差异引起的,但我对这个主题不是很有经验,所以我很难说出某些原因.

我尝试将大小更改为预期的最大字节数,如下所示;

typedef struct AVData {
    ...  
    BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;
Run Code Online (Sandbox Code Playgroud)

这有助于它开始工作,但在尝试销毁库的解码器对象时,我不时会遇到内存访问冲突问题.

这肯定存在一些问题.我没有SDK的源代码,只有DLL,Lib和Header文件.我的问题是:

1)在Visual Studio 6.0版本中为固定大小的数组分配空间是否合法?

2)是否有任何可能的方法(编译器选项等)使相同的代码适用于较新的VS版本/ C++运行时?

3)由于我编辑头文件的工作方式可以达到某一点但仍有问题,你知道有什么更好的方法可以解决这个问题吗?

And*_*rsK 3

IIRC 这是创建大小可变的结构的老技巧。

考虑

struct {
  int len;
  char name[1];
} s;
Run Code Online (Sandbox Code Playgroud)

如果完成了适当的分配,“名称”现在可以是可变长度,并且它将按顺序布置在内存中:

char* foo = "abc";
int len = strlen(foo);

struct s* p = malloc( sizeof(int) + len + 1 );

p->len = len;
strcpy(p->name, foo );
Run Code Online (Sandbox Code Playgroud)

我认为上面的内容在较新版本的 Visual Studio 中也应该可以正常工作,也许这是打包的问题,​​您是否已完成 #pragma pack(1) 来获取字节边界上的结构?我知道 VS6 已经默认了。