字符指针导致输出错误

时间:2012-01-23 15:17:41

标签: c++ char

我有关于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';

但它仍然无法正常工作

感谢任何帮助...

拉​​扎

6 个答案:

答案 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]不再有效。