在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币1019 
 
 
 
TA的每日心情  | 开心 2018-7-23 21:04 | 
|---|
 
  签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II 
金牌会员 
   
	- 积分
 - 17000
 
 
- 最后登录
 - 1970-1-1
  
 
 | 
 
 本帖最后由 lkl0305 于 2015-9-5 23:59 编辑  
 
好吧,写了这个标题感觉对不起sizeof。 
其实不是sizeof的错,是我的错,小疏忽  
  
============================================================== 
一、问题描述: 
1、看KSDK库错了,发现很多历程打印字符串或数组时,经常用sizeof来计算数组长度,比如uint8_t test[10]; 
那test数组的长度是多少? 
sizeof(test)/sizeof(uint8_t)就搞定了,简单吧。 
2、具体sizeof的作用是什么呢? 
每本c语言书上都有: 
sizeof是C语言的一种单目操作符,它并不是函数。 
sizeof操作符以字节形式给出了其操作数的存储大小。 
操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 
3、来看看一个例子,我在KDS上写的: 
 
 
输出是什么呢,下面的是输出。没有任何问题。 
 
 
4、那把数组作为参数传递给函数后,在函数内能使用么? 
如下程序输出什么呢? 
 
 
答案是如下图: 
 
 
5、很明显是错误的,为什么呢? 
 
二、解决办法: 
想要解决问题,首先要知道问题所在,在这里有2点要明白: 
 
1、数组作为参数传递给函数时,通过数组的指针是没有办法判断数组长度的,除非你的数组中有明显的结束标志。 
2、在函数内部sizeof(test)这个是测试指针的存储空间,当然在32位字长的ARM中是4个字节。 
sizeof(test)/sizeof(uint8_t)=4/1,当然上面打印出4个数组元素。 
3、知道了原因后,解决办法就好了: 
通常的做法是传递数组给函数时,在函数内部想要知道数组长度时,一般要把数组长度使用参数同时传递进来。 
如下图: 
 
 
在其它地方调用就可以了。 
 
 
  
整个测试程序如下: 
 
- #include "fsl_device_registers.h"
 
 - #include "fsl_debug_console.h"
 
 - #include "board.h"
 
 - #include "string.h"
 
  
- void sizeof_Test(uint8_t * test)
 
 - {
 
 -     uint32_t i;
 
  
-     for (i = 0; i < sizeof(test)/sizeof(uint8_t); i++)
 
 -     {
 
 -         PRINTF("%d ", test[i]);
 
 -     }
 
 -     PRINTF("\r\n");
 
 - }
 
  
- void right_test(uint8_t * test, uint32_t count)
 
 - {
 
 -     uint32_t i;
 
  
-     for (i = 0; i < count; i++)
 
 -     {
 
 -         PRINTF("%d ", test[i]);
 
 -     }
 
 -     PRINTF("\r\n");
 
 - }
 
  
- int main(void)
 
 - {
 
  
-     /* Write your code here */
 
 -     uint32_t i;
 
 -     uint8_t test1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
  
-     hardware_init();
 
  
-     PRINTF("\r\nSizeof test:\r\n");
 
  
-     PRINTF("\r\n-----------------Using sizeof in main-----------------\r\n");
 
  
-     for (i = 0; i < sizeof(test1)/sizeof(uint8_t); i++)
 
 -     {
 
 -         PRINTF("%d ", test1[i]);
 
 -     }
 
 -     PRINTF("\r\n");
 
  
-     PRINTF("\r\n------------Using sizeof in sub function--------------\r\n");
 
  
-     sizeof_Test(test1);
 
  
-     PRINTF("\r\n---------------------The right method-----------------\r\n");
 
  
-     right_test(test1, sizeof(test1)/sizeof(uint8_t));
 
  
-     /* This for loop should be replaced. By default this loop allows a single stepping. */
 
 -     for (;;) {
 
 -         ;
 
 -     }
 
 -     /* Never leave main */
 
 -     return 0;
 
 - }
 
 - ////////////////////////////////////////////////////////////////////////////////
 
 - // EOF
 
 - ////////////////////////////////////////////////////////////////////////////////
 
  复制代码 
输出结果如下: 
  
 
 
  
三、感想与收获: 
1、传递数组给函数时,在函数内部使用数组长度时,一般要把数组长度使用参数同时传递进来。 
  
比如KSDK库中很多这样的函数: 
串口输出函数: 
 
 
I2C主机输出函数: 
 
 
SPI主机传输函数: 
 
 
  
等等…… 
 
 
 
        
        
        
         |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |