5

我的情况很奇怪。我正在尝试在我的相机管理软件中实现一个 10 多年前的 pci 相机设备 SDK。制造商不再营业,我没有机会获得官方帮助。所以我在这里,为我的丑陋问题寻找一些帮助。

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

typedef struct AVData {
    ...  
    BYTE audioVideoData[1];
}AVDATA, *PAVDATA;

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

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

typedef struct AVData {
    ...  
    BYTE audioVideoData[20000];
}AVDATA, *PAVDATA;

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

这肯定有问题。我没有 SDK 的源代码,只有 DLL、Lib 和 Header 文件。我的问题是:

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

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

3)由于我编辑头文件的解决方法在一定程度上有效但仍然存在问题,您知道解决此问题的更好方法吗?

4

3 回答 3

3

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

考虑

struct {
  int len;
  char name[1];
} s;

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

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

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

p->len = len;
strcpy(p->name, foo );

我认为以上内容在较新版本的 Visual Studio 中也应该可以正常工作,也许这是一个打包问题,你有没有做过#pragma pack(1) 来获取字节边界上的结构?我知道 VS6 将其作为默认设置。

于 2012-05-11T13:37:05.797 回答
3

像这样的 C 结构中的单元素数组通常意味着直到运行时才知道大小。(有关 Windows 示例,请参阅BITMAPINFO。)

通常,会有一些其他信息(可能在结构中)告诉您缓冲区需要多大。您永远不会直接分配其中之一,而是分配正确大小的内存块,然后进行转换:

int size = /* calculate frame size somehow */
AVDATA * data = (AVDATA*) malloc(sizeof(AVDATA) + size);
// use data->audioVideoData
于 2012-05-11T13:38:53.330 回答
1

代码几乎肯定会以某种方式表现出未定义的行为,除了修复 SDK 的接口或源代码之外,没有其他方法可以解决此问题。由于它不再营业,这是不可能的。

于 2012-05-11T13:41:18.227 回答