我正在尝试添加到第三个向量。两个不同向量的加法和乘法。但是我无法理解为什么输出值不符合预期。
我使用的方法是:显示、添加和执行产品。
void mostrar(int vecAMostrar[], int tamanioVector){
for(int i = 0; i < tamanioVector ; i++){
cout << vecAMostrar[i] << endl;
}
return;
}
void suma(int vec1[], int vec2[], int vecResultado[], int tamanioAceptado){
for(int i = 0; i < tamanioAceptado; i++){
vecResultado[i] = vec1[i] + vec2[i];
}
return;
}
void producto(int vec1[], int vec2[], int vecResultado[], int tamanioAceptado){
for(int i = 0; i < tamanioAceptado; i++){
vecResultado[i] = vec1[i] * vec2[i];
}
return;
}
但是,当我在 main 中调用它们时:
int main()
{
int vecUno[] = {1, 2, 3, 4, 5};
int vecDos[] = {1, 2, 3, 4, 5};
int vecSuma[] = {};
int vecProducto[] = {};
producto(vecUno, vecDos, vecProducto, 5);
cout << "PRODUCTO" << endl;
mostrar(vecProducto, 5);
suma(vecUno, vecDos, vecSuma, 5);
cout << "SUMA" << endl;
mostrar(vecSuma, 5);
return 0;
}
我得到的是第二个输出是错误的。我在 main 或函数中做错了吗?
问题是好像内存管理不好,vec2取了最后一次操作的值,我在测试,如果你认为安排是固定的,最后的结果没有问题,试试make当然:
这些是您初始化向量的行。
您正在使用两种不同的语言功能,它们以错误的方式组合会导致您的代码行为异常。
隐式数组大小扣除。
如果在初始化数组时明确指定了元素,C++ 语言(以及 C)允许省略数组的大小;在这种情况下,编译器将计算节省程序员繁琐的元素,在您的情况下:
因为当您初始化
vecSuma
y时,vecProducto
您给了它们一个空列表,这些列表的元素计数为零,因此它们包含零个元素;另一方面vecUno
,vecDos
包含五个元素,因为用于初始化它们的列表的元素计数是五个;在内存中,它们看起来像:如您所见,它们
vecSuma
都不vecProducto
指向内存空间,因为它们有 0 个元素!数组到指针衰减。
将数组传递给函数而不指示其大小等效于传递指向数组第一个元素的指针,因此您的函数
mustrar
,suma
和producto
可以重写为接受指针而不影响其行为:但是,如果您在函数的数组参数中指定了大小(而不是将其作为附加参数添加),您将收到编译时错误:
通过将参数作为对给定大小的数组的引用( 的那个奇怪的参数
tipo (&nombre)[tamaño]
)传递,我们可以防止数组衰减为指针,因此编译器被迫检查传递的参数是否与预期的参数匹配;正如我们在错误中看到的不匹配:没有元素的数组不是五个元素的数组。你的节目发生了什么?
我们已经看到
vecSuma
并且vecProducto
不指向任何内存空间(当然,它们有零元素),因此通过索引和写入它们,您会强制程序进入未定义的行为,这可能会使程序在没有任何可见错误的情况下工作,或者可能导致腐败。内存不足(显示错误的值),或者它可能会擦除你的硬盘,引发第三次世界大战,或者在你的鼻孔里召唤恶魔。如何解决?
正如Dariel Ramos Díaz de Villegas已经评论过的那样,一种可能的解决方案是为目标数组分配大小(尽管他没有解释为什么会解决它),这样您就可以避免未定义的行为,因为数组
vecSuma
并将vecProducto
指向一个足够大的内存空间,非常适合分配运算结果;如果您要使用前缀大小的数组,我还建议使用这些数组的类型作为参数的类型,从而确保编译器在编译时检测到错误:在上面的代码中,我们为类型定义了一个别名
int[5]
(一个由五个整数组成的数组)并用它来声明函数参数,你可以在这里看到代码工作;请注意,仅用于读取的参数也作为常量传递,这被认为是一种好习惯;还要记住,我已经删除了return
函数末尾的指令,这不是必需的,因为函数无论如何都会结束。另一种选择,事先知道大小,是使用 a
std::array<int, 5>
而不是 aint[5]
。其他要记住的事情。
using namespace std;
使用标题(它不适用于你的情况),阅读这个线程找出原因。\n
vs ,阅读这个帖子找出原因。std::endl