[资料分享与下载] sizeof引发的小错误

[复制链接]
 楼主| 舒斯特尔 发表于 2015-10-12 08:20 | 显示全部楼层 |阅读模式
一、问题描述:
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、知道了原因后,解决办法就好了:
通常的做法是传递数组给函数时,在函数内部想要知道数组长度时,一般要把数组长度使用参数同时传递进来。
如下图:

在其它地方调用就可以了。


 楼主| 舒斯特尔 发表于 2015-10-12 08:21 | 显示全部楼层
整个测试程序如下:
  1. #include "fsl_device_registers.h"
  2. #include "fsl_debug_console.h"
  3. #include "board.h"
  4. #include "string.h"

  5. void sizeof_Test(uint8_t * test)
  6. {
  7.     uint32_t i;

  8.     for (i = 0; i < sizeof(test)/sizeof(uint8_t); i++)
  9.     {
  10.         PRINTF("%d ", test[i]);
  11.     }
  12.     PRINTF("\r\n");
  13. }

  14. void right_test(uint8_t * test, uint32_t count)
  15. {
  16.     uint32_t i;

  17.     for (i = 0; i < count; i++)
  18.     {
  19.         PRINTF("%d ", test[i]);
  20.     }
  21.     PRINTF("\r\n");
  22. }

  23. int main(void)
  24. {

  25.     /* Write your code here */
  26.     uint32_t i;
  27.     uint8_t test1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  28.     hardware_init();

  29.     PRINTF("\r\nSizeof test:\r\n");

  30.     PRINTF("\r\n-----------------Using sizeof in main-----------------\r\n");

  31.     for (i = 0; i < sizeof(test1)/sizeof(uint8_t); i++)
  32.     {
  33.         PRINTF("%d ", test1[i]);
  34.     }
  35.     PRINTF("\r\n");

  36.     PRINTF("\r\n------------Using sizeof in sub function--------------\r\n");

  37.     sizeof_Test(test1);

  38.     PRINTF("\r\n---------------------The right method-----------------\r\n");

  39.     right_test(test1, sizeof(test1)/sizeof(uint8_t));

  40.     /* This for loop should be replaced. By default this loop allows a single stepping. */
  41.     for (;;) {
  42.         ;
  43.     }
  44.     /* Never leave main */
  45.     return 0;
  46. }
  47. ////////////////////////////////////////////////////////////////////////////////
  48. // EOF
  49. ////////////////////////////////////////////////////////////////////////////////
 楼主| 舒斯特尔 发表于 2015-10-12 08:21 | 显示全部楼层
输出结果如下:



三、感想与收获:
1、传递数组给函数时,在函数内部使用数组长度时,一般要把数组长度使用参数同时传递进来。


比如KSDK库中很多这样的函数:
串口输出函数:

I2C主机输出函数:

SPI主机传输函数:


等等……
C洛达尔多 发表于 2015-10-12 08:32 | 显示全部楼层
这个sizeof函数是写程序的时候用的比较多的
FSL_TICS_Jeremy 发表于 2015-10-12 09:12 | 显示全部楼层
谢谢楼主分享,有时候,小问题,会带来**烦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

277

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

25

主题

277

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部