打印
[资料分享与下载]

sizeof引发的小错误

[复制链接]
1277|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
舒斯特尔|  楼主 | 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 | 只看该作者
整个测试程序如下:
#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
////////////////////////////////////////////////////////////////////////////////

使用特权

评论回复
板凳
舒斯特尔|  楼主 | 2015-10-12 08:21 | 只看该作者
输出结果如下:



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


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

I2C主机输出函数:

SPI主机传输函数:


等等……

使用特权

评论回复
地板
C洛达尔多| | 2015-10-12 08:32 | 只看该作者
这个sizeof函数是写程序的时候用的比较多的

使用特权

评论回复
5
FSL_TICS_Jeremy| | 2015-10-12 09:12 | 只看该作者
谢谢楼主分享,有时候,小问题,会带来**烦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

277

帖子

1

粉丝