for loop crashing ... segFault c ++

时间:2016-03-21 02:44:02

标签: c++

我有一个循环遍历数组列表的日期并在变量num中存储一个int,当我循环前7天,我的程序崩溃,我希望它在第1天重新启动并更改为猴子& #39; 1' ...但在第一个循环之后它崩溃了。

我做错了什么?

C ++

//*********************************************************************************************
//                               function prototype
//*********************************************************************************************
void collectFood(string days[]);



int main(){

    //array to hold week days
    string days[7] = {"Mon", "Tue", "Wen", "Thur", "Fri", "Sat", "Sun"};

    collectFood(days);

}
//*********************************************************************************************
//                    function to collect foods amounts
//*********************************************************************************************
void collectFood(string days[]){    
    int num = 0;

    // for loop for each monkey
    for (int monkey=0; monkey < 3; monkey++){
        // for loop to take 7 days worth of food per monkey
        for (int day=0; day < sizeof(days); day++){
            cout << "Enter the pounds of food eaten by monkey " << monkey
            << " on " << days[day]  << ": ";
            cin >> num ;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在您使用的上下文中,您对预期幅度的计算不正确。一个简单的C类型数组(无论其类型如何,都是您所拥有的)在作为简单参数传递时表示为指向类型的指针。

因此,这个:

void collectFood(string days[])

相当于:

void collectFood(string *days)

很明显sizeof(days)确实是{em>指针到string的大小。在您的平台上,我可以安全地假设您正在编译64位代码,因为该上下文中的指针将八个字节,因此您将超过阵列的实际大小一个元素。

有很多方法可以做到这一点。您可以简单地向collectFood函数声明一个额外的参数,用于描述序列的大小。

void collectFood(string days[], size_t N)

并在您的for循环条件中使用N,从collectFood调用此main()

collectFood(days, sizeof(days)/sizeof(*days));

另一种方法是采用从数组推导出的非类型参数的模板,该参数由引用传递:

template<size_t N>
void collectFood(string (&days)[N])
{
   ...
}

再次使用for-condition中的N作为计数限制。在这种情况下,来自main()的来电将保持原样。电话会推断N。作为额外的好处,您不能意外地将原始指针传递给此函数;它必须是一个声明的数组类型,或者无法推断出幅度,编译器会发出错误告诉你。

还有其他方法,但前者只是简单地传递长度并将其声明为正式参数,这可能是您最容易理解的。

祝你好运。

答案 1 :(得分:1)

当你使用sizeof(天)时,我认为这是你的内循环。将数组传递给函数时,它只传递一个指向数组第一个元素的指针,而不是整个数组。

你可以通过添加一个告诉你数组大小的函数参数来解决这个问题,或者你可以切换到使用带有size()方法的std :: vector。我个人会选择std :: vector。