我有一个 for 循环,循环遍历一组天数并将一个 int 存储在变量 num 中,当我循环遍历前 7 天时,我的程序崩溃了,我希望它在第 1 天重新启动并更改为 monkey ' 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 ;
}
}
}
最佳答案
在您使用的上下文中,您对预期幅度的计算不正确。当作为简单参数传递时,一个简单的 C 类型数组(这是您拥有的,无论其中的类型如何)表示为指向类型的指针。
因此,这:
void collectFood(string days[])
等同于:
void collectFood(string *days)
很明显 sizeof(days)
确实是指向 string
的指针的大小。在您的平台上,我可以安全地假设您正在编译 64 位代码,因为该上下文中的指针将是 8 字节,因此您将超出数组的实际大小一个元素。
有多种方法可以做到这一点。您可以简单地为描述序列大小的 collectFood
函数声明一个额外参数。
void collectFood(string days[], size_t N)
并在您的 for 循环条件中使用 N
,从 main()
调用 collectFood
:
collectFood(days, sizeof(days)/sizeof(*days));
另一种方法是采用从数组中推导出的非类型化参数的模板,该数组由引用传递:
template<size_t N>
void collectFood(string (&days)[N])
{
...
}
再次,在 for-condition 中使用 N
作为计数限制。在这种情况下,来自 main()
的调用将保持原样。 N
将由调用推导出来。作为一个额外的好处,您不会不小心将原始指针传递给该函数;它必须是声明的数组类型,否则无法推导出大小,编译器会报错告诉您。
还有其他方法,但其中前者,简单地传递长度并将其声明为形式参数,可能是您最容易理解的。
祝你好运。
关于c++ - for 循环崩溃... segFault c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122335/