zoukankan      html  css  js  c++  java
  • 由编译器指定数组长度带来的一个问题

    【目的】

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

  • 相关阅读:
    gulp 相关文章
    webpack相关文章
    nodejs 教程
    MVC,MVP 和 MVVM 的图示,区别
    Webpack——解决疑惑,让你明白
    如何在修改bug时切换分支保留修改又不提交
    JavaScript中的两个“0” -0和+0
    node-wechat 微信推送消息
    git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚
    git如何回滚远程仓库
  • 原文地址:https://www.cnblogs.com/skullboyer/p/8639067.html
Copyright © 2011-2022 走看看