2012-01-23 114 views
2

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


} 

输出I在主要得到的是一些很怪之一.... 在调试时我发现,当“test.name”是传递给输出流它不仅 给出垃圾输出,但它也将“deviceInfo”对象的“名称”值更改为该垃圾值... 这是一种测试场景,但在实际应用中,必须执行此testFunc以同样的方式,即恒定的char字符串应该被赋予char ptr的名字。我尝试把'\ 0'在char temp的末尾像这样temp [strlen(temp)] ='\ 0';

,但它仍然不工作

任何帮助表示赞赏...

拉扎

+0

也许temp [50]超出范围,然后'name'指向释放的内存。试着把testout中的'cout'放在里面,看看会发生什么。 –

+0

如果我删除了“temp”变量,它将起作用。我认为当函数返回时,你的临时“temp”数组会被取消分配。 – 2012-01-23 15:23:30

+0

[可以访问局部变量的内存吗?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) –

回答

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仍然是一个指针。

+0

如果你使用'strdup',记得一旦你完成'释放'内存。我建议使用'std :: string',除非手动内存管理有很好的理由。 –

+0

那么使用char名称[50]解决了这个问题.... :)但我只需要知道为什么它是char ptr的问题? 这是由于char ptr不再访问本地temp变量的原因,因为它在testFunction退出后被销毁? –

4

temp是一个堆栈分配的变量,它将在testFunc()返回后被销毁。

所以你的char*会指向被破坏的记忆。

这会导致未定义的行为。

+0

thanx的帮助:) –

5

这是失败的,因为您将自动变量的指针分配给具有不同范围(因此具有不同生命周期)的结构的成员。 将在testFunc结束时被销毁,并且进一步访问它是非法的。

+0

重要的一点.... thnx的帮助.... –

1

您正在分配一个指向临时数组的指针。一旦testFunc()返回,您的临时数组将被销毁,并且您的指针将指向随机存储器。

+1

感谢您的帮助... :) –

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; 
} 
+0

不幸的是我不能在这里使用字符串:)不过问题解决 –

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]不再是函数返回后有效。

+0

thnx的帮助它解决了这个问题.. –