我遇到了一个奇怪的情况。我正在尝试为我的相机管理软件实现一个 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) 由于我的编辑头文件的解决方法工作到一定程度但仍然存在问题,您知道解决此问题的更好方法吗?
最佳答案
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 将其作为默认设置。
关于c++ - Visual Studio 版本之间不同的未分配内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552185/