代码之家  ›  专栏  ›  技术社区  ›  Syed Ali Salman M David

memcpy()导致iOS中的EXC_BAD_ACCESS

  •  3
  • Syed Ali Salman M David  · 技术社区  · 10 年前

    我得到了 NSData 在我的套接字接收函数上,我试图将数据复制到 tempbuffer 在我的音频类中,我使用外部类型全局变量来实现这一点。

    这是我的代码:

    memcpy([recorder tempBuffer].mdata,(__bridger const void *)data,data.length);
    

    录音机是我的 extern 键入音频类的全局变量。

    当控制到达这行代码时,会抛出异常,可能是什么错误。

    2 回复  |  直到 10 年前
        1
  •  5
  •   Steven Fisher    10 年前

    这里确实有三种可能性:

    1. [recorder tempBuffer].mdata 不是有效的指针。(例如,它是什么类型的?如果它是 NSMutable数据 ,您应该访问 mutableBytes 属性。)
    2. [记录器tempBuffer].mdata 不是足够大小的有效指针( data.length ).
    3. (__bridger const void *)data 不是足够大小的有效指针。

    在这三个问题中,我可以保证第三个问题需要解决。A. 操作文件数据 它本身不是所需的数据,而是一个包装所需数据的对象。你应该使用 data.bytes .

    另外两个,我帮不了你。我不知道什么类型 mdata 是或分配的位置。

        2
  •  0
  •   Rob Md Fahim Faez Abir    10 年前

    如果目标缓冲区确实是您分配的缓冲区 malloc uint8_t (或同等)缓冲区,您应该:

    1. 检查以确保目标缓冲区足够大,可以容纳整个 data 目录

    2. 不要试图将 NSData (void *) 指针,而是使用:

      memcpy(destination, data.bytes, data.length);
      

      如果 操作文件数据 不在连续块中(在iOS 7和更高版本中可能不在), data.bytes 将其复制到一个连续缓冲区,然后您可以使用 memcpy .

    3. 或者更好的做法是,通过删除 内存 总计:

      [data getBytes:destination length:data.length];
      

      如果 操作文件数据 不在连续块中,请避免 数据字节 将其复制到连续缓冲区,然后使用 内存 .

      要旨 操作文件数据 具有丰富的界面,可以消除使用低级 内存 给自己打电话。

    从这个问题来看,还不清楚是什么 [recorder tempBuffer].mdata 以及你如何分配,所以也许你可以澄清一下。希望这不是另一个 操作文件数据 对象。