C语言中结构体数组长度怎么计算?
就类似于:
length=(sizeof(array)/sizeof(array[0]));
(array是已定义并赋值的数组)
对于结构体数组应该怎么操作?
代码中数据比较多,我就简单的把这部分功能的代码发上来。
就是希望可以得到array这个数组的长度。
#include <stdio.h>
typedef struct subject{
char name[10];
double score;
} SUB;
SUB array[]={
{"语文",0},{"数学",0},{"英语",0}
};
int length(SUB a[]){
return (int)(sizeof(a)/sizeof(a[0]));
}
int main(){
int i;
i=length(array);
printf ("%d",i);
return 0;
}
在角落戳纸人
10 years, 11 months ago
Answers
修正:还是去掉会误导Novice的内容吧,不谈C99变长数组的GCC Extension了。
你这代码的错误在于,将函数参数声明成数组类型,在C标准中,将参数声明成数组类型等同于声明成指针类型,下面两个声明是等价的:
int length(SUB a[]);
int length(SUB *a);
而你在length里写
sizeof(a)
,sizeof不是function,它只有两种形式:
- sizeof unary-expression
- sizeof ( type-name )
你在函数中写个 sizeof(a),等同于写
sizeof(SUB *)
,a的类型是
SUB *
,所以得到的结果是指针的大小,而
sizeof(a[0])
,等同于
sizeof(SUB)
。怎么可能正确呢?
C中定义数组,习惯用
#define N 3
这种形式将长度定义成常量。如果数组长度是编译器察看后面初始化式自动计算出来的,也可以这样写啊:
#define ARRAY_LEN (sizeof(array)/sizeof(array[0]))
sizeof不是函数!它的返回值是编译时期,编译器计算出来的!对于
sizeof(array)
,它是第一种形式,编译器相当于作了这样的操作:先得到array的类型SUB array[4],然后再计算sizeof(SUB array[4])。C语言中数组定义时都是有大小的,所以这种计算一定OK
简而言之,在C语言中,
你无法写出这样的工具函数
:
int length(Type a[]);
E丶Max
answered 10 years, 11 months ago