C++ 运行时检查失败#2

C++ 运行时检查失败#2,c++,C++,我对这样的错误有问题:运行时检查失败#2-变量'numb'周围的堆栈已损坏。 它出现在该函数的最后一个括号中: int problem20() { int res = 0, i; int numb[160]; for(i = 0; i < 160; i++) numb[i] = 0; numb[0] = 1; for(i = 1; i < 100; i++) { multiply(numb, i, num

我对这样的错误有问题:运行时检查失败#2-变量'numb'周围的堆栈已损坏。 它出现在该函数的最后一个括号中:

int problem20()
{
    int res = 0, i;
    int numb[160];
    for(i = 0; i < 160; i++)
        numb[i] = 0;
    numb[0] = 1;
    for(i = 1; i < 100; i++)
    {
        multiply(numb, i, numb, 160);
    }
    for(i = 0; i < 160; i++)
        res += numb[i];
    return res;
}
int problem20()
{
int res=0,i;
int numb[160];
对于(i=0;i<160;i++)
麻木[i]=0;
麻木[0]=1;
对于(i=1;i<100;i++)
{
乘法(numb,i,numb,160);
}
对于(i=0;i<160;i++)
res+=麻木[i];
返回res;
}
编辑:

void乘法(int*a1,int*a2,int*res,int-l)
{
内部温度,i,m=a2,k;
对于(k=0;m>0;k++)
m/=10;
int*结果=新的int[l+k];
对于(i=0,temp=0;i

函数miltiply只是将numb乘以i,然后将结果交给第三个参数。此函数没有问题,之前已经测试过。

您的问题是将numb作为乘法函数的res参数传递。乘法函数创建一个大小为l+k的数组,然后尝试将其复制到大小为l的numb数组,这意味着您超出了numb数组的边界,这反过来会触发此问题


我建议将int*参数转换为对std::vector的引用,以避免手动分配临时数组。

请将源代码包括在
乘法()中。
可能
(l+k)
大于160。好的,谢谢。问题出在memcpy和l+k中,谢谢。您不能这样做:
memcpy(res,result,sizeof(int)*(l+k))
您的静态数组只够:
memcpy(res,result,sizeof(int)*l)
void multiply(int* a1, int a2, int* res, int l)
{
    int temp, i, m = a2, k;
    for(k = 0; m > 0; k++)
        m /= 10;
    int *result = new int[l + k];

    for(i = 0, temp = 0; i < l; i++)
    {
        result[i] = a1[i] * a2 + temp;
        temp = result[i] / 10;
        result[i] %= 10;
    }
    for(i = l; i < l + k; i++)
    {
        result[i] = temp % 10;
        temp /= 10;
    }
    memcpy(res, result, sizeof(int) * (l + k));
    delete[] result;
}