为什么C语言中使用sizeof()计算数组长度得到错误结果?
错误原因
你在insert函数中使用sizeof(array)/sizeof(array[0])计算数组长度得到错误结果,核心原因是 C语言中数组作为函数参数传递时会自动退化为指针:
- 在
main函数中,你定义的int array[5]是实打实的数组类型,此时sizeof(array)计算的是整个数组占用的总字节数,除以单个元素的字节数可以得到正确的元素个数5。 - 当你把
array传入insert函数时,形参int * array本质是一个指向数组首元素的指针,sizeof(array)计算的是指针本身占用的字节数,而不是整个数组的字节数。你得到结果为2,说明你当前编译环境下指针占4字节、int类型占2字节,4/2=2,所以得到错误的计算结果。
另外你的代码还有两处额外问题:
exit是系统函数,必须加括号传参,正确写法是exit(EXIT_FAILURE);- 你当前定义的
array长度只有5,且已经存满了5个元素,直接插入会触发数组越界访问,如果需要支持插入功能,定义数组时要预留足够的空余容量。
修复方案
你已经把数组当前已存储的元素个数number_of_elements作为参数传入了insert函数,只需要在传参时额外传入数组的总容量即可,不需要在函数内计算数组长度。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> // 新增参数array_capacity表示数组的总容量 void insert(int * array,int number_of_elements,int array_capacity,int index,int value) { int i; // 直接用传入的总容量判断是否可插入 if(number_of_elements >= array_capacity) { printf("Insertion failed"); exit(EXIT_FAILURE); } else { for(i=number_of_elements;i>index;i--) { array[i]=array[i-1]; } array[index]=value; } } int main() { // 数组定义为10个长度,预留插入空间,总容量为10 int array[10],i,number_of_elements=5,value=-9,index=3; for(i=0;i<=number_of_elements-1;i++) { scanf("%d",&array[i]); } printf("\n"); for(i=0;i<=number_of_elements-1;i++) { printf("%d\t",array[i]); } printf("\n"); // 传入数组总容量10 insert(array,number_of_elements,10,index,value); number_of_elements +=1; for(i=0;i<number_of_elements;i++) { printf("%d\t",array[i]); } printf("\n"); return 0; }
内容的提问来源于stack exchange,提问作者Shreyansh Pathak
相关产品推荐
相关产品推荐

