在 C++ 中使用一些 C 代码并出现访问冲突错误
Using some C code in C++ and getting Access voilation error
我正在尝试在 C++ Builder 社区版中使用 sflowtool.c 中的以下代码,但收到访问冲突。
uint32_t TForm3::getData32_nobswap(SFSample *sample)
{
uint32_t ans = *(sample->datap)++; // HERE I GET THE ERROR
if((uint8_t *)sample->datap > sample->endp) {
SFABORT(sample, SF_ABORT_EOS);
}
return ans;
在 &sample 传递给上面的函数之前,它有这个
SFSample sample;
memset(&sample, 0, sizeof(sample))
sample.rawSample = (uint8_t *) AData[0];
sample.datap = (uint32_t *) sample.rawSample;
sample.endp = (uint8_t *) sample.rawSample + sample.rawSampleLen;
sample.datagramVersion = getData32(&sample);
其中 AData 的类型为 "const TIdBytes AData"
任何人都可以给我一些指示来理解原因吗?与 C 相比,C++ 处理上述代码有什么不同吗?
感谢@Michael Beer 和@PaulMcKenzie 的评论,他们足以让我意识到问题是 "const TIdBytes AData"。作为一种快速解决方案,我能够通过将 TIDBytes[] 转换为 char[] 并进一步使用 char[] 来实现目标,并且效果很好
char buf[AData.Length];
for(int i=0;i<AData.Length;i++)
{
buf[i] = AData[i];
}
memset(&sample, 0, sizeof(sample));
sample.rawSample = (uint8_t *) buf;
还有一个 "Delphi way" 这个也行
char buf[AData.Length];
BytesToRaw(AData,buf,AData.Length);
谢谢你的精彩
你的意思是:
sample.rawSample = (uint8_t *) &AData[0];
注意额外的 &
。这意味着您将 rawSample
设置为 AData
数组中第一个元素的地址,而不是将 AData
视为指针数组并从中获取第一个指针。
我正在尝试在 C++ Builder 社区版中使用 sflowtool.c 中的以下代码,但收到访问冲突。
uint32_t TForm3::getData32_nobswap(SFSample *sample)
{
uint32_t ans = *(sample->datap)++; // HERE I GET THE ERROR
if((uint8_t *)sample->datap > sample->endp) {
SFABORT(sample, SF_ABORT_EOS);
}
return ans;
在 &sample 传递给上面的函数之前,它有这个
SFSample sample;
memset(&sample, 0, sizeof(sample))
sample.rawSample = (uint8_t *) AData[0];
sample.datap = (uint32_t *) sample.rawSample;
sample.endp = (uint8_t *) sample.rawSample + sample.rawSampleLen;
sample.datagramVersion = getData32(&sample);
其中 AData 的类型为 "const TIdBytes AData"
任何人都可以给我一些指示来理解原因吗?与 C 相比,C++ 处理上述代码有什么不同吗?
感谢@Michael Beer 和@PaulMcKenzie 的评论,他们足以让我意识到问题是 "const TIdBytes AData"。作为一种快速解决方案,我能够通过将 TIDBytes[] 转换为 char[] 并进一步使用 char[] 来实现目标,并且效果很好
char buf[AData.Length];
for(int i=0;i<AData.Length;i++)
{
buf[i] = AData[i];
}
memset(&sample, 0, sizeof(sample));
sample.rawSample = (uint8_t *) buf;
还有一个 "Delphi way" 这个也行
char buf[AData.Length];
BytesToRaw(AData,buf,AData.Length);
谢谢你的精彩
你的意思是:
sample.rawSample = (uint8_t *) &AData[0];
注意额外的 &
。这意味着您将 rawSample
设置为 AData
数组中第一个元素的地址,而不是将 AData
视为指针数组并从中获取第一个指针。