我有关于char ptr输出的问题。以下是我试图执行的示例代码..
struct DeviceInfo{
char * name;
int id;
};
void testFunc(DeviceInfo *info){
char temp[50] = "test input";
info->name = temp;
}
void main(){
DeviceInfo deviceInfo;
testFunc(&deviceInfo);
std::cout<<"Output is "<<deviceInfo.name;
}
输入我得到的主要是某种奇怪的.... 在调试时我发现当“test.name”传递给输出流时它不仅仅是 给出垃圾输出,但它也将“deviceInfo”对象的“name”值更改为该垃圾值... 这是一种测试场景,但在实际应用中,这个testFunc必须以相同的方式执行,即常量char字符串应该被命名为char ptr。
我试着把'\ 0'放在char temp的末尾,就像这个temp [strlen(temp)] ='\ 0';
但它仍然无法正常工作
感谢任何帮助...
拉扎
答案 0 :(得分:5)
这是失败的,因为您将指向自动变量的指针分配给具有不同范围(因此具有不同生命周期)的结构的成员。 temp
将在testFunc
结束时被销毁,进一步访问它是非法的。
答案 1 :(得分:4)
temp
是一个堆栈分配的变量,它会在testFunc()
返回后被销毁。
所以你的char*
将指向被破坏的记忆。
这会导致未定义的行为。
答案 2 :(得分:4)
这就是为什么我们有一个字符串类。
struct DeviceInfo{
std::string name;
int id;
};
void testFunc(DeviceInfo *info){
info->name = "test_input";
}
int main(){
DeviceInfo deviceInfo;
testFunc(&deviceInfo);
std::cout<<"Output is "<<deviceInfo.name;
}
答案 3 :(得分:3)
您正在存储指向本地存储的指针,当testFunc()
超出范围时,指针会消失。
常量字符串的正确方法是:
info->name = "test input";
或更具活力的东西:
info->name = strdup("test input");
您也可以选择不将name
变为指针,而是在结构中使用char name[50];
,然后执行:
strcpy(info->name, "test input");
如果您拥有尺寸感知版本,也建议使用它:
snprintf(info->name, sizeof info->name, "%s", "test input");
请注意,如果sizeof info->name
仍然是指针,则假设数组解决方案name
没有意义。
答案 4 :(得分:1)
您正在指定一个临时数组的指针。一旦testFunc()
返回,你的临时数组将被销毁,你的info->name
指针将指向随机存储器。
答案 5 :(得分:0)
char *temp = "test input";
info->name = (char*)malloc(sizeof(char) * strlen(temp) + 1); // Include room for \0
strcpy(info->name, temp);
而不是:
char temp[50] = "test input";
info->name = temp;
函数返回后,char temp[50]
不再有效。