Class vector
{
int *v ;
int size;
public:
vector(int m ) // create a null vector
{
v=new int[size = m];
for(int i=0;i<size;i++)
v[i]=0;
}
vector(int *a) //create a vector from an array
{
for(int i=0;i<size;i++)
v[i]=a[i];
}
int operator*(vector &y) //scalar product
{
int sum=0;
for(int i=0;i<size;i++)
sum+=this->v[i]*y-v[i];
return sum;
}
};
int main()
{
int x[3]={1,2,3};
int y[3]={4,5,6};
vector v1(3); //create a null vector of 3 integers
vector v2(3);
v1=x; //create v1 from the array x
v2=y;
int R=v1*v2;
cout<<”R=”r;
return 0;
}
执行上述程序后,此时出现分段错误(“v1 = x”;) 任何人都可以解释为什么我得到分段错误。
答案 0 :(得分:2)
当您从vector
构建int*
时,您不必设置size
,但您可以访问其值。此构造函数用于从赋值所需的int*
到vector
的隐式转换。访问未初始化的值会导致程序具有未定义的行为。很可能size
在某些无法访问的内存中有效地产生了一些值。
您已将分配的左侧设置为具有特定大小这一事实并不起作用。如果您从int*
到vector
定义了自己的作业,可以提供帮助:
vector& vector= (int* other) {
// ...
}
拥有此赋值运算符(当然,使用合适的实现)将避免从int*
到vector
的隐式转换,您可以使用左侧的size
。 / p>
到目前为止,这不是您代码中唯一的程序:
答案 1 :(得分:0)
问题在于如何分配内存。我们只看这四行:
vector v1(3); //create a null vector of 3 integers
v1=x; //create v1 from the array x
在第一行中,使用vector(int m)构造函数形式创建新对象v1。这里在堆上分配了一个新的int数组。
在第三行中创建一个新对象,替换第1行中指定的对象。这里问题开始,因为这一行使用了既不分配v数组的vector(int * a)构造函数,也不是设置大小变量。因此,您将输入复制到未分配的地址,这会导致堆栈错误。此外,您永远不会释放在第一行构造函数中分配的内存。
您的代码存在其他问题: 在* -operator中,将int与向量
相乘sum += this->v[i] * y - v[i];
^^^
虽然没有定义这个乘法运算符。
这一行也不会编译:
cout<<”R=”r;
首先是因为缺少&lt;&lt;在“R =”和r之间,然后因为奇怪的“。