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)由于我对编辑头文件的解决方法很有效但仍有问题,你知道有什么更好的解决方法吗?
答案 0 :(得分:3)
IIRC是一个创建大小可变的结构的老技巧。
考虑
struct {
int len;
char name[1];
} s;
如果完成了适当的分配,'name'现在可以是可变长度的,并且它将按顺序排列在内存中:
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有默认值。
答案 1 :(得分:3)
像这样的C结构中的单元素数组通常意味着在运行时之前大小是未知的。 (有关Windows示例,请参阅BITMAPINFO。)
通常,会有一些其他信息(可能在结构中)告诉您缓冲区需要多大。你永远不会直接分配其中一个,而是分配正确大小的内存块,然后投射它:
int size = /* calculate frame size somehow */
AVDATA * data = (AVDATA*) malloc(sizeof(AVDATA) + size);
// use data->audioVideoData
答案 2 :(得分:1)
代码几乎肯定会以某种方式展示未定义的行为,除了修复SDK的接口或源代码之外,没有办法解决这个问题。由于它不再经营,这是不可能的。