为什么递增到 C 中的整数会导致溢出?

Why is an incremental increase to an integer in C causing overflow?

我正在研究 CS50,目前正在开发一个小函数来确定选举的获胜者。

  void print_winner(void)
    {
        int max_votes = 0;
        int num_of_winners = 0;
        string winners [] = {};
    
        for (int i = 0; i < candidate_count; i++) {
        //Determine if the candidate has enough votes to be considered a winner
            if (candidates[i].votes >= max_votes) {
                //If so, increment the number of winners
                num_of_winners ++;
                //Assign the winning candidate to the winners array
                winners[i] = candidates[i].name;
                //And reset the max number of votes required to now be considered a winner
                max_votes = candidates[i].votes;
            }
           printf("number of winners  %i\n", num_of_winners);
        }
    
    for (int i = 0; i < num_of_winners; i++) {
         printf("winner  %s\n", winners[i]);
    }
        return;
    }

每当我 运行 函数时,计数器似乎会正确递增,但在最后的打印输出中,数字显然是错误的:

我仍在学习 C,从我读到的内容来看,这听起来像是内存分配问题或某种整数溢出问题,但我不确定问题是什么以及如何解决。

您的数组 winners 的大小为 0,因为您已将其初始化为:

string winners [] = {};

因此没有有效的索引 i 可让您写入 winners[i]。为您的数组提供适当的初始大小。另外,C 中的 'string' 到底是什么?

C 不允许 zero-length 数组,因此您完全依赖编译器提供的扩展来接受它:

        string winners [] = {};

但是接受了对你没有用,因为C数组的维度是不可调的。因此,任何访问数组 winners 元素的尝试都会超出其边界,从而产生未定义的行为。您观察到的数据损坏是此类 UB 的常见表现之一。

解决问题的方法是声明数组足够大以支持您要支持的最大情况(并明确拒绝更大的情况),或者为它动态分配内存,并在您发现需要时增加分配做。