c++ - 需要使用 std::string 用 const char* 填充数组,但它不起作用(我认为它正在存储指针)?
问题描述
我在一个类中定义了一个 const char*,我需要在将其存储在数组中之前填充数字数据
像这样的东西
编辑:更好的最小可重现示例代码
#include <string>
class A
{
public:
const char* a[3];
std::string s1;
void func1();
void func2();
void func3();
//func4(), func5(), func6()............func50();
void output();
void print();
};
void A::func1()
{
s1 = "1";//can be any number determined by the function being called
}
void A::func2()
{
s1 = "2";
}
void A::func3()
{
s1 = "3";
}
void A::output()
{
int i = 0, j = 0;
for (int i = 0; i < 3; i++)
{
switch (i)
{
case 0:
func1();
break;
case 1:
func2();
break;
case 2:
func3();
break;
}
a[i] = s1.c_str();
}
}
void A::print()
{
for (int i = 0; i < 3; i++)
{
printf("%s ", a[i]);
}
}
int main()
{
A example;
example.output();
example.print();
}
我希望这里的数组是 = {1, 2, 3},但它是 {3, 3, 3}。有几个这样的功能。
这是上一个,解释起来有点复杂,所以我在上面写了
class A:
{
public:
const char* s1;
void func1();
void func2();
void func3();
//etc.. there are several 50 other functions like this but i've omitted them
void output();
}
void A::func1()
{
//do some function work here
int data = 6//can be anything
std::string n = std::to_string(n);
s1 = n.c_str();
//do something else
}
void A::func2()
{
//do some function work here
int data = 6//can be anything
std::string n = std::to_string(n);
s1 = n.c_str();
//do something else
}
//etc...
void output()
{
const char* a[16];
int j = 0;
while(something)
{
switch(i):
{
case 1:
func1();
break;
case 2:
func2();
break;
case 3:
func3();
break;
//etc..
}
const char* a[j % 16] = s1;
j++;
}
//draw a to the screen
}
基本上我需要存储来自以字符串形式调用的各个函数的“当前”16个int数据并实时绘制它(数组预先填充了“NULL”)但问题是数组得到填充相同的值。例如,如果 func1() 为 6 且 func2() 为 5 且 func3() 为 4 且当前 func3() 已被调用,则 const char* a 数组为 = {"4", "4", "4" , "NULL"....} 当它应该是 {"6", "5", "4", "NULL", "NULL"....} 所以当我将它实时绘制到屏幕上时当它应该是 = 6、5、4、NULL、NULL、NUll 时,我只看到 4。我认为问题是数组正在存储指向地址字符串的指针,所以当它改变数组中的所有值时。如果需要更清楚,我可以解释
解决方案
欢迎来到悬空指针的世界!据说 C++ 对那些(或至少对 C 不那么敏感)免疫,但前提是您不在中间混合原始指针。
当您编写时,a[i] = s1.c_str();
您会a[i]
指出 . 拥有的数据s1
。指针仅在s1
被修改之前有效。在这里你是(不)幸运的,因为所有 3 个值的s1
大小都相同,因此实现已经重新使用了相同的内存。所以这 3 个指针仍然指向一个有效地址,它只包含s1
.
但形式上,a[0]
和a[1]
是悬空指针,因为它们指向一个已达到其生命周期的对象,并且只是a[2]
一个有效的指针。
推荐阅读
- javascript - 从Angular 6中的对象中删除值
- java - 从 TCP/IP 连接 Java 读取双精度值
- php - 在 Woocommerce 中为一种运输方式自动应用优惠券
- javascript - 重新渲染组件不会更新功能组件内的对象
- nativescript - 在 Nativescript Vue 中使用 Fresco 插件时 SimpleDraweeView 未初始化错误
- hyperledger - 在 hyperledger-composer 中使用 JS 更新 acl 文件
- javascript - Firebase Cloud Function 在 JavaScript 中读取节点时打印“未定义”?
- java - 来自异步方法的 Feign 调用
- ios - URL 未在 WKWebView Xamarin 中加载
- liferay - 我们如何防止 Liferay 管理员用户(具有管理员角色)登录公共 URL