在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币721
TA的每日心情 | 开心 2018-7-23 21:04 |
---|
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
金牌会员
 
- 积分
- 16702
- 最后登录
- 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主机传输函数:
等等……
|
评分
-
查看全部评分
|