2011-11-07 87 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上的删除调用是否有效 - 自从它被“新建”以来,您一直在增加它。