You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:31:02