size_t与int作为函数参数的区别?快速排序用size_t报core dumped原因
问题核心原因
你的程序崩溃本质是无符号整数size_t的下溢特性导致的逻辑错误,具体触发流程如下:
size_t是C/C++标准定义的无符号整数类型,数值永远不会为负,当你对值为0的size_t变量执行减1操作时,会发生整数下溢,最终得到该类型能表示的最大值(32位环境下为4294967295,64位环境下为18446744073709551615)。- 你的快排递归逻辑中,当
pivot等于start(即分区后基准值落在当前区间最左侧)时,调用quicksort(numbers, start, pivot - 1)就会触发上述下溢:此时pivot-1变成一个极大的正整数,远大于start的值。 - 递归终止条件
if(end > start)会被误判为成立,程序进入非法递归分支,访问vector时索引远远超出容器实际长度,最终触发越界错误导致core dumped。
换成int正常运行的原因
int是有符号整数类型,当pivot为0时pivot-1的结果是-1,此时end=-1、start=0,end > start的条件不成立,递归会正常终止,不会触发非法越界访问。
保留size_t的正确写法
不需要强制换成int,只要调整递归分支的触发条件即可避免下溢问题:
void quicksort(std::vector<int>& numbers, size_t start, size_t end) { if(end > start){ size_t pivot = partition(numbers, start, end); // 仅当左区间合法(pivot左侧还有元素)时递归左半部分 if (pivot > start) { quicksort(numbers, start, pivot - 1); } // 仅当右区间合法(pivot右侧还有元素)时递归右半部分 if (pivot < end) { quicksort(numbers, pivot + 1, end ); } } }
内容的提问来源于stack exchange,提问作者Mohamed Soliman
相关产品推荐
相关产品推荐

