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

程序无法正确获取数组最大值:sizeof处理指针参数问题及解决方法

问题根源分析

在C语言中,数组作为函数参数传递时会隐式退化为指向数组首元素的指针。此时sizeof(array)获取的是指针类型的大小(32位系统为4字节,64位系统为8字节),而非原数组的总字节数,导致sizeof(array)/sizeof(array[0])的计算结果完全错误,无法正确遍历数组元素。

解决方法

方法1:额外传入数组长度参数(最常用方案)

调用函数时主动传递数组的元素个数,函数内部用该长度控制循环范围:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>  // 必须包含此头文件才能使用INT_MIN

int HighestNumber(int* array, size_t length)
{
    int highest = INT_MIN;
    for(size_t x = 0; x < length; x++)
        if(array[x] > highest)
            highest = array[x];
    return highest;
}

int main()
{
    int *array = (int*)malloc(4*sizeof(int));
    array[0] = 66;
    array[1] = 552;
    array[2] = -17;
    array[3] = 1000;
    // 传入数组实际长度4
    printf("%d", HighestNumber(array, 4));
    free(array);  // 释放malloc分配的内存,避免泄漏
    return 0;
}

方法2:用哨兵值标记数组末尾

约定一个数组元素不会使用的特殊值(比如INT_MAX)作为结束标记,遍历到该值时停止:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int HighestNumber(int* array)
{
    int highest = INT_MIN;
    int current;
    // 遍历到哨兵值INT_MAX时终止循环
    while((current = *array++) != INT_MAX)
        if(current > highest)
            highest = current;
    return highest;
}

int main()
{
    // 多分配一个空间存储哨兵值
    int *array = (int*)malloc(5*sizeof(int));
    array[0] = 66;
    array[1] = 552;
    array[2] = -17;
    array[3] = 1000;
    array[4] = INT_MAX;  // 哨兵值
    printf("%d", HighestNumber(array));
    free(array);
    return 0;
}

方法3:用结构体封装数组与长度

将数组指针和长度打包为结构体,函数接收结构体参数,实现数据的绑定传递:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

// 定义封装数组的结构体
typedef struct {
    int* data;
    size_t length;
} IntArray;

int HighestNumber(IntArray arr)
{
    int highest = INT_MIN;
    for(size_t x = 0; x < arr.length; x++)
        if(arr.data[x] > highest)
            highest = arr.data[x];
    return highest;
}

int main()
{
    int *array = (int*)malloc(4*sizeof(int));
    array[0] = 66;
    array[1] = 552;
    array[2] = -17;
    array[3] = 1000;
    
    IntArray arr = {.data = array, .length = 4};
    printf("%d", HighestNumber(arr));
    free(array);
    return 0;
}

额外注意事项

原代码缺少limits.h头文件,INT_MIN属于未定义状态,必须添加该头文件才能正常使用;同时malloc分配的内存记得用free释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Rezno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:50:25