那里。 我现在正在学习C ++入门。当我写一段关于指针的程序让我感到困惑。 下面的程序的功能是将字符串读入向量并将向量复制到字符指针数组中。对于向量中的每个元素,分配一个新的字符数组,并将vector元素中的数据复制到该字符数组中。然后打印字符串数组的内容。
这是我的代码:
vector<string> str_vector;
string str_temp;
while(getline(cin,str_temp)){
str_vector.push_back(str_temp);
}
typedef const char *cptr;
cptr *cptr_array = new cptr[str_vector.size()];
cptr *p = cptr_array;
for(vector<string>::iterator iter = str_vector.begin();
iter != str_vector.end(); iter++,p++){
*p = (*iter).c_str();
}
cout<<"Output Char Array Element"<<endl;
cptr *q = cptr_array;
while(*q){
cout<<*q<<endl;
q++;
}
delete [] cptr_array;
当我运行程序时,它会在输出字符串数组后崩溃。 我可以使用以下代码执行相同的操作而不会发生任何崩溃。
cptr *q = cptr_array;
for(int i = 0; i < str_vector.size(); i++,q++){
cout<<*q<<endl;
}
我只是想知道为什么上面的输出代码无法正常工作。非常感谢大家!
答案 0 :(得分:2)
while(*q){
您使用*q
作为条件。迭代数组后,q
指向数组结束后的位置,访问*q
是非法的。
答案 1 :(得分:2)
*q = cptr_array;
while(*q){
在遍历数组后,循环不仅会取消引用越界q
,也不能使用while(q)
进行测试,因为数组末尾没有nullptr sentinel。最简单的事情是在cptr
中再分配一个元素,而不是需要保存指向所有字符串值的指针,然后将最后一个元素的指针值设置为nullptr
(0
)