处理指针数组

时间:2014-03-17 20:53:01

标签: c++ arrays pointers

我正在玩数组作为指针。

#include<iostream>
#include<cstring>

using namespace std;

int main(){
    string *myarray[20];
    *myarray[0]="Ich denke sein";
    *myarray[1]="Ich sehe sein";
    cout<<*myarray[0]<<endl;
    cout<<*myarray[1]<<endl;
    return 0;
}

上面的代码编译但在执行时,出现错误,程序挂起。当我使用visual studio调试时,它表示内存分配错误。这里有什么错误? 据我所知,我正在处理各地指针所引用的价值观。

7 个答案:

答案 0 :(得分:3)

您已经分配了一个包含20个字符串指针的数组。但是你没有为指针指向的内容分配任何内存。而不是追求这个并使用new为字符串分配内存,而不是为数组中的字符串本身分配内存,你会没事的。

string myarray[20];
myarray[0]="Ich denke sein";
myarray[1]="Ich sehe sein";
cout<<myarray[0]<<endl;
cout<<myarray[1]<<endl;

为了回应您的评论,要使您的程序工作,请将指针设置为指向新的string对象

myarray[0]=new string("Ich denke sein");
myarray[1]=new string("Ich sehe sein");

您的计划的其他部分保持不变。注意

  • 剩下的myarray[i]2<=i && i<20仍然是垃圾。 (在0循环中将它们设置为nullptrfor会更简洁。)
  • 您还应该delete您分配的对象。 (如果您先清除其余的指针,可以在整个数组上使用for循环来执行此操作。)
  • 正如其他答案所评论的那样,在现代C ++中,除非绝对必须,否则最好不要直接使用指针。而且您通常也希望对数组使用vector而不是使用内置类型(在C ++ 11中,array类型可用于您知道编译时长度的数组)。

答案 1 :(得分:1)

你有一组未初始化的指针:

string *myarray[20];

然后你把它看作指针指向有效对象:

*myarray[0]="Ich denke sein";

这是未定义的行为。它与数组无关。这与此相同:

std::string* s;
*s = "boom!";

除此之外,如果你想使用#include <string>,你真的应该std::string

答案 2 :(得分:1)

首先,您没有包含正确的标题。对于字符串,您应该:

#include <string>

其次,程序挂起,因为您将数据分配给指针所指向的位置。那么myArray [0]指向哪里?你不知道,我不知道,没有人知道。无论你是否处理它们的数组,似乎你都没有掌握指针的所有内容。

要使用指针,它必须指向某个有效的位置。如果不这样做,则不能取消引用指针并分配数据。就这么简单。

答案 3 :(得分:1)

可能问题是那些指针没有指向内存中的任何地址。应使用“运算符地址”(&amp;)将指针初始化到某处或使用“new”关键字将它们放入空闲内存中,如果这样做,请不要忘记使用“删除”释放该内存“关键字。希望对你有用。

答案 4 :(得分:1)

  

这里有什么错误?

错误是,您正在使用指针; - )

#include <string>
#include <iostream>

int main() {
   std::string myarray[2] = {
      { "Ich denke sein" }, { "Ich sehe sein" } };
   std::cout << myarray[0] << std::endl;
   std::cout << myarray[1] << std::endl;
   return 0;
}

使用指针的原因是什么?在C ++中,你几乎从不使用指针。

亲切的问候 - 安德烈亚斯

答案 5 :(得分:1)

你已经声明了一个包含20个指针的数组。在为其指向的位置分配值之前,必须为指针分配内存。

string* myarray[20];
for(int i = 0; i < 20; i++) {
     myarray[i] = new string();//allocating memory to the pointer
}
*myarray[0]="Ich denke sein";
*myarray[1]="Ich sehe sein";
cout<<*myarray[0]<<endl;
cout<<*myarray[1]<<endl;

答案 6 :(得分:1)

指针用于指向内存地址,如下所示:

String text ="hello";
String *myptr = &text;

现在指针指向字符串文本的地址。

或者您可以使用new关键字为指针数组分配内存。 new返回指向数组第一个位置的指针。像这样:

int *myptr = new int[20];

但请记住使用delete,以便稍后释放分配的内存。像这样:

delete[] myptr