c++ - for 循环崩溃... segFault c++

标签 c++

我有一个 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/

相关文章:

c++ - Boost asio ip tcp iostream 错误检测

c++ - 用于向所有 mpi 进程发送和接收的时间高效设计模型 : MPI all 2 all communication

c++如何正确声明另一个类的友元类方法

c++ - 无法在函数模板中使用 lambda 函数

c++ - Windows 上的 Qt::AA_SynthesizeMouseForUnhandledTouchEvents

c++ - 加载 HTML 时获取 webview 文档标题

c++ - 我应该删除 main.cpp 中 new 关键字创建的东西吗?

c++ - 禁用局部变量的未初始化警告

c++ - 定义宏后的哈希符号?

c++ - cstring -> c++ 字符串转换