2011-11-07 83 views
3

我正在學習使用指針來複制char數組。通過指針傳遞char數組到另一個臨時數組指針

我在C++中有以下代碼。我想要做的是傳輸和數組(set1)使用指針指向另一個指針數組(temp)。

但是當我嘗試打印出(temp)時,它與(set1)不一樣。

通過指針傳遞數組到另一個臨時數組指針。

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    char set1[] = "ABC"; 

    char* p = &set1[0]; 

    int tempSize = 0; 
    char* temp = new char[256]; 

    for (int i = 0; i < 3; i++) 
    { 
     *temp = *p; 
     cout << *temp; // ABC 
     ++temp; 
     ++tempSize; 

     ++p; 
    } 

    cout << "\n"; 

    for (int i = 0; i < tempSize; i++) 
    { 
     cout << temp[i]; // Why ABC is not printed? 
    } 

    delete [] temp; 

    return 0; 
} 

回答

5

//爲什麼不打印ABC?

因爲你的指針在不確定的行爲旅行區域:

char* temp = new char[256]; 
... 
++temp; // gone !! 

最重要的是,

  1. 你不終止與\0字符串到底(不得在你的代碼中需要)
  2. delete[]最後這個損壞的指針。

既然你正在編寫的學習目的,我建議簡單的解決你的代碼:

char* const temp = new char[256]; 
     ^^^^^ ensures `temp` is not modifiable 

現在使用temp[i]遍歷的目的。

+0

謝謝,我更新了代碼來做到這一點。 for(int i = 0; i <3; i ++) temp [i] = * p; ++ p; } – user1033627

0

這是因爲在循環複製數組中,您更改temp。循環之後,它指向複製數據之外的一個。

此外,您忘記終止新分配的數組。您應該在末尾添加字符'\0'

0

的問題是這一行:

++temp; 

您遞增指針,然後寫入。最後temp[i];不是指向你的字符串的開始,而是指向最後。

做到這一點,最簡單的方法是用去除第一for循環:

for (int i = 0; i < 3; i++) 
{ 
    temp[i] = set1[i]; 
} 
temp[4] = '\0'; // don't forget to close the string 
0

C風格的字符串有一個空終止 - 「ABC」包含四個大字。另外,我不確定temp上的刪除調用是否有效 - 自從它被「新建」以來,您一直在增加它。