程序无法正确获取数组最大值: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
相关产品推荐
相关产品推荐

