在 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 视为指针数组并从中获取第一个指针。