3
char ** Ptr;
char apple[15];
char cake[15];
Ptr = new char*[2];

Ptr[0]=apple;
Ptr[1]=cake;

可惜更新后Ptr[1]Ptr[0]变成cake除了Ptr[1]。我很确定问题是我如何声明Ptr我本质上希望它是一个字符串数组。有没有办法在我保留的地方做到这一点char ** Ptr

编辑:

{
char **Ptr;
{
char apple[15];
Ptr = new char*[2];
for(int k=0;k<2;k++)
{
memset(apple,0,15);
//apple=
Ptr[k]=apple; //Note that apple in fact changes everytime
}
//Originally I had Ptr[k]=apple but it seemed I was merely copying the address of  
//apple which works great except when I leave the scope trying to call it the addr no 
//longer exists and I was getting lucky the last entry showed up at all. So I then 
//figured I would use

strcpy(Ptr[k],apple);

//I then checked the value for both was correct even when I deleted apple.
// Finally I leave the scope where all this is taking place
}
cout<<Ptr[0];
cout<<Ptr[1];
}

幸运的是,它们实际上是等效的垃圾。前几个字符是相同的,但大多是垃圾。我认为可能是范围问题,Ptr所以基本上使它成为全球同样的问题。无论如何,我留下了最初的问题,即使它不包含任何问题,因为每个人都很好地指出,因为我已经制作了单独的变量cake(呜呜声)。任何帮助将不胜感激。

无论如何,感谢您的时间。

4

2 回答 2

1

即使在您编辑之后,您的意思仍然不是很清楚,特别是因为您似乎确实了解指针和范围是什么。

不再存在,我很幸运最后一个条目出现了。所以我想我会用

strcpy(Ptr[k],apple);

如果你像这样使用,那么你必须为堆上的每个strcpy分配内存,你的代码就可以正常工作。 Ptr[k]

但是,由于您使用 C++ 进行编码,因此最好坚持使用 C++ 功能。即,不是分配数组chars和指向 的指针chars,这是一种 C 方法,而是使用以下内容:

vector<string> Ptr;
{
    string apple;
    for(int k=0;k<2;k++)
    {
        //apple=
        Ptr.push_back(apple);
    }
}
cout<<Ptr[0];
cout<<Ptr[1];

为了清楚起见,在这里我将变量的名称和代码结构保持不变,尽管Ptr显然不再是指针。

于 2012-11-30T21:07:40.120 回答
-3

用于Ptr = malloc(sizeof(char *) * 2);代替Ptr = new char*[2];

于 2012-11-30T17:33:51.233 回答