为什么递增到 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 的常见表现之一。
解决问题的方法是声明数组足够大以支持您要支持的最大情况(并明确拒绝更大的情况),或者为它动态分配内存,并在您发现需要时增加分配做。
我正在研究 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 的常见表现之一。
解决问题的方法是声明数组足够大以支持您要支持的最大情况(并明确拒绝更大的情况),或者为它动态分配内存,并在您发现需要时增加分配做。