我正在玩数组作为指针。
#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调试时,它表示内存分配错误。这里有什么错误? 据我所知,我正在处理各地指针所引用的价值观。
答案 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
循环中将它们设置为nullptr
或for
会更简洁。)delete
您分配的对象。 (如果您先清除其余的指针,可以在整个数组上使用for
循环来执行此操作。)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