2012-01-23 117 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的幫助它解決了這個問題.. –