64,648
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(void)
{
int number,i= 0;
vector<int> ivec;
int *arr= new int[ivec.size()];
cout<< "Enter the vector"<< endl;
while(cin>> number)
{
ivec.push_back(number);
arr[i]= ivec[i];
}
for(i= 0;i!= ivec.size(); ++i)
cout<< arr[i]<< endl;
delete [] arr;
return 0;
}
int *arr= new int[ivec.size()];
多分配一个空间int *arr= new int[ivec.size()+1];
就可以了?
vector<int> ivec;
int *arr= new int[ivec.size()];
在这里,ivec中不包含任何数据,所以ivec.size()等于0,那么第一行就是int *arr = new int[0]。
在c和c++中,不存在分配0字节这样的事情,因为这样的话,那返回的指针该是多少呢?如何区分两个new出来的0长度数组?也是,c和c++在分配内存的时候,至少会分配一个字节的空间,这样就有一个合法的地址了。
int *arr = new int[ivec.size()] =》int *arr = (int *)(new char[1]);
很显然,这里arr[0]并不合法,因为我们本来只有1个字节的合法空间,现在却要求存取4个字节的内容。如果运气不好,arr[i]= ivec[i];这一行可能直接就崩了。
改为int *arr= new int[ivec.size()+1];之后,上面说的问题就不存在了,因为现在我们确实是有1个int的空间了。在while循环中,i始终等于0,输入的数字一直在覆盖这一块区域。虽然逻辑不合你的要求,但是绝对不会崩溃。
再来看后面的for循环。
for(i= 0;i!= ivec.size(); ++i)
cout<< arr[i]<< endl;
这里i从0到ivec.size()-1。在ivec中,这都是合法的下标。但是对arr就不合法了。
你前面arr只是分配了1个字节的内存空间(运行new的时候,ivec.size()为0,之后就算ivec.size()改变,arr的长度也不可能再变了,除非你再new一次),所以只有arr[0]是合法的,后面所有的arr[i]都是越界访问,出错很正常。