由编译器指定数组长度带来的一个问题

【目的】

   在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 等部分函数功能无法使用

原文地址:https://www.cnblogs.com/skullboyer/p/8639067.html