【目的】
在main.c文件中使用在header.c文件中定义在header.h中声明的由编译器指定长度的数组
【代码】
<header.c>
1 #include "arrayTest.h" 2 3 4 5 unsigned char array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 6 7 8 9 10 void print_arraySize0(void) 11 { 12 printf("sizeof(array[])= %d ", sizeof(array)); 13 }
<header.h>
1 #include <stdio.h> 2 3 #ifndef __ARRAYTEST_H__ 4 #define __ARRAYTEST_H__ 5 6 7 8 extern unsigned char array[]; 9 10 11 void print_arraySize0(void); 12 13 14 #endif
<main.c>
1 #include "arrayTest.h" 2 3 4 5 6 void print_arraySize(void) 7 { 8 #if 0 9 printf("sizeof(array[])= %d ", sizeof(array)); 10 #endif 11 } 12 13 14 void print_array(unsigned char *array) 15 { 16 char i =0; 17 18 for(; i <9; i++) 19 { 20 printf("sizeof(array[%d])= %d ", i +1, array[i]); 21 } 22 } 23 24 25 int main(void) 26 { 27 28 print_arraySize0(); 29 30 print_array(array); 31 32 33 while(1); 34 return 0; 35 }
【编译运行环境】
C-Free5.0, KEIL5.20
【编译运行结果】
> 打开函数 print_arraySize 内的打印功能,则报错 main.cpp:7: error: invalid application of `sizeof' to incomplete type `unsigned char[]'
> 打开函数 print_arraySize 内的打印功能,则运行结果为
【分析及结论】
> 由于定义的数组大小是由编译器分配的,在文件<header.c>中使用 sizeof(array) 是OK的,在文件<main.c>中使用 sizeof(array) 就报错,因为文件<main.c>中使用 sizeof(array) 的数组是文件<header.h> 声明的 extern unsigned char array[],这就让编译其误认为此数组未指定大小,导致使用 sizeof(array) 报错
> 不论是在源文件还是头文件中,数组大小由编译器分配,数组的内容都能正确访问,就是如 sizeof 等部分函数功能无法使用