C语言中数组sizeof值在main与其他函数间变化的原因咨询
数组传参时
sizeof结果不一致的原因及解决方法 问题本质
- 在
main函数中,table是数组类型(int[5]),sizeof(table)计算的是整个数组的总字节数:5个int元素 × 4字节/int= 20字节。 - 当数组作为参数传递给函数时,会触发数组退化为指针的规则——此时函数参数里的
int* table本质是一个指向int的指针,而非数组。在64位系统中,指针的固定大小为8字节,因此sizeof(table)返回8。
你的代码的核心问题
函数内的循环条件i < sizeof(table)/sizeof(int)会计算出8/4=2,导致循环仅执行2次,完全无法完成冒泡排序;同时,若后续数组长度变化,还会因错误的循环范围引发数组越界访问的未定义行为。
修正后的代码
需要手动将数组长度作为参数传递给排序函数,同时修正冒泡排序的循环边界:
#include <stdio.h> #include <stdlib.h> void bubble_sort(int* table, int length) { printf("Size of table pointer in bubble sort function : %d\n", sizeof(table)); int permutation = 1; int number = 0; while(permutation != 0) { permutation = 0; // 循环到length-1,避免访问table[i+1]时越界 for (int i = 0; i < length - 1; i++) { if (table[i] > table[i+1]) { number = table[i]; table[i] = table[i+1]; table[i+1] = number; permutation++; } } } } int main() { int table[5] = {3, 20, 12, 4, 21}; int length = sizeof(table)/sizeof(int); // 仅在数组定义的作用域内可安全计算长度 printf("Size of table in main function : %d\n", sizeof(table)); bubble_sort(table, length); // 打印排序结果验证 printf("Sorted array: "); for(int i=0; i<length; i++){ printf("%d ", table[i]); } printf("\n"); }
关键补充
- 只有当数组处于完整类型作用域(比如定义它的函数内)时,
sizeof才能正确返回数组总字节数。数组一旦被传递给其他函数,就会退化为指针,无法再通过sizeof获取原数组的大小。 - 冒泡排序的循环边界必须设为
i < length - 1,否则当i等于最后一个元素的索引时,i+1会超出数组范围,触发未定义行为。
内容的提问来源于stack exchange,提问作者NoCodeGamer
相关产品推荐
相关产品推荐

