c++; 我使用的是Box 2D(但是这个问题可能只关于C++本身),并且有一个成员变量,它是空的指针,像这样: void* userData; int user[] = int; playerDef.userData = &user; int* sd = (int*)bb->GetUserData();

c++; 我使用的是Box 2D(但是这个问题可能只关于C++本身),并且有一个成员变量,它是空的指针,像这样: void* userData; int user[] = int; playerDef.userData = &user; int* sd = (int*)bb->GetUserData();,c++,C++,您可以通过getUserData()获取userData,它返回一个空指针 我想将字符串存储为userData,并将userData设置为字符串,如下所示: std::string user = "player"; playerDef.userData = &user; 然后,我尝试通过以下操作获取用户数据: std::string* sd = (std::string*)bb->GetUserData(); char user[] = "player"; playerDef.

您可以通过getUserData()获取userData,它返回一个空指针

我想将字符串存储为userData,并将userData设置为字符串,如下所示:

std::string user = "player";
playerDef.userData = &user;
然后,我尝试通过以下操作获取用户数据:

std::string* sd = (std::string*)bb->GetUserData();
char user[] = "player";
playerDef.userData = &user;

char* sd[] = (char*)bb->GetUserData();
(其中“bb”是指向持有这些信息的实体的指针)

最后,我尝试使用函数c_str()以获得与我的目的兼容的内容,但随后出现错误: 访问冲突读取位置0x00000070

我也希望能够使用char数组执行相同的操作,但我正在这样做:

std::string* sd = (std::string*)bb->GetUserData();
char user[] = "player";
playerDef.userData = &user;

char* sd[] = (char*)bb->GetUserData();
第三步给出了错误: 无法从“char”转换为“char*[]”*

通过查看char部分的这种方法,我已经感觉到有些地方出了问题,但我不知道是什么

我对整数做了同样的事情,如下所示:

void* userData;
int user[] = int;
playerDef.userData = &user;

int* sd = (int*)bb->GetUserData();
这非常有效

因此,我的问题如下:

  • std::string部分有什么问题
  • char部分有什么问题以及如何实现char数组 我想要什么
  • 那么整数部分是如何工作的:/(我知道它不是数组)
注意:我非常乐意得到关于可能的优化的额外想法,比如用户静态施法之类的

谢谢!非常感谢,非常感谢

干杯

std::string user = "player";
playerDef.userData = &user;
当在此处设置此指针的任何函数返回时,
user
std::string
对象将被销毁。在某处有一个指向这个
std::string
的指针这一事实并没有改变这一点

您随后尝试使用此指针时失败得很惨,因为很明显,字符串已被破坏,指针指向垃圾

当你使用
int
数组时,它也被破坏了。在这种情况下,您的程序没有崩溃这一事实并没有改变这是一种未定义的行为和错误

<>这是一个常见的情况,当C++代码与一个通用C库集成时,它对C++类一无所知,它提供的所有工作都是不透明的,乏味的<代码>空洞指针。有几种方法可以正确执行此操作。常用的方法是使用动态范围:

playerDef.userData = new std::string;
*playerDef.userData = "player";
稍后,您可以取消对该指针的引用,在一定程度上确信指向的对象仍然存在,并且没有从高轨道上被核弹击中


当然,现在您需要确保在某个时刻这将得到
delete
d,否则您将泄漏内存。但在使用C库的不透明指针时,这通常是最好的方法。

我怀疑您试图保存指向本地字符串的指针,该字符串在作用域结束时会被破坏。使用动态分配的字符串,您应该可以。如果不是这样,您需要发布一个。Ïnteger部分与char部分不同。注意
char*sd[]
vs
int*sd
,效果非常好。
--如果您的
int
版本与
string
版本相似,那么如果它是一个本地数组,效果就不太好。