当前位置: 首页 > news >正文

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

【目的】

   在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\n", 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\n", 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\n", 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

相关文章:

  • 我只想安静地写代码,领导却跟我谈大局、讲奉献(转 程序员精选)
  • js中的DOM节点操作---增删改查
  • 线程同步(3个条件)
  • 类的组合
  • 模块------计算对数
  • 安装vue开发环境→安装淘宝镜像的时候报错
  • Python生成随机验证码
  • Java执行JavaScript代码
  • c#数字图像处理(十一)图像旋转
  • C语言——第二次作业(2)
  • Mark
  • winform httpclient 多文件上传
  • 一维数组高效率解决杨辉三角
  • 使用 Except 和 Intersect
  • ES6 使用forEach遍历数组
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript标准库系列——Math对象和Date对象(二)
  • learning koa2.x
  • leetcode386. Lexicographical Numbers
  • node和express搭建代理服务器(源码)
  • SegmentFault 2015 Top Rank
  • 从输入URL到页面加载发生了什么
  • 代理模式
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何设计一个微型分布式架构?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #传输# #传输数据判断#
  • $.ajax()
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (分布式缓存)Redis哨兵
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四) Graphivz 颜色选择
  • (算法)Travel Information Center
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)ABI是什么
  • (转)可以带来幸福的一本书
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .equals()到底是什么意思?
  • .gitignore
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 使用配置文件
  • .net反编译工具
  • .sdf和.msp文件读取