为何lobstr包obj_addr返回地址与自定义R包获取的指针地址不一致?
为什么自定义R包获取的地址与lobstr::obj_addr返回的不一致?
这两个地址指向的是R对象中完全不同的部分:
lobstr::obj_addr(x) 返回的是R对象本身的地址
R中的所有对象(包括你定义的整数向量x)本质是一个SEXP结构体实例,这个结构体里存储了对象的元数据(比如类型、长度、属性列表),同时包含一个指向实际数据存储区域的指针。obj_addr()返回的就是这个SEXP结构体在内存中的位置。你的C++代码打印的是向量数据缓冲区的起始地址
当使用.C()接口传递R向量时,R会自动将向量内部存储数据的缓冲区指针传递给你的C++函数参数int* address,而不是传递SEXP对象本身的地址。你打印的address指向的是向量第一个元素(也就是3)所在的内存位置,这和SEXP结构体的地址自然不同。
验证说明
你代码中打印的address[0] = 3正好对应向量x的第一个元素,这也能佐证:你拿到的是实际存储数据的内存区域起点,而非整个R对象的结构体地址。如果要在C++中获取SEXP对象的地址,需要使用.Call()接口而非.C(),因为.Call()直接传递SEXP指针。
内容的提问来源于stack exchange,提问作者user1436187
相关产品推荐
相关产品推荐

