请教STM32字符串变量问题: strlen()和sizeof()均不返回长度值(软件仿真)?

2019-10-15 20:49发布

新手注册,赏金不多,见谅!刚刚因为工作需要要熟悉STM32,以前编过几年的51……
开发环境为Keil MDK 5, 使用了原子的部分库函数。
最近碰到要组合字符串的需求,输出一个版本信息。

用main函数初步测试,发现无论使用 strlen() 还是 sizeof() 均不能返回字符串(数组)的长度(容量大小)。
请问各位有没有谁碰到过这种情况?

Use MicroLIB 状态下:
测试代码如下:
1.首先包含了必要的标准库文件:
[mw_shl_code=c,true]
/*************ANSI C 标准库头文件************/
//禁止半主机模式
#pragma import(__use_no_semihosting)
#include <stdio.h>  //struct __FILE, printf, sprintf... Need Target->Use MicroLIB
//#include "mystdio.h"//struct __FILE, printf, sprintf... Need Target->Use MicroLIB
#include <string.h> //standard string operation: strcpy, strcat...
.......
[/mw_shl_code]

2.main()下加入如下代码:
[mw_shl_code=c,true]
int main(void)
{
    char * s[2], str[30], sTmp[20];
    const char *pcc = "abcdef";
    uint16_t i = 103, f;
    size_t len = 0;

    s[0] = "JLP280";
    s[1] = "-A/A-";
    sprintf(sTmp, "%s", s[0]);
    strcat(sTmp, s[1]); //sTmp = s[0] + s[1]
    f = i;
    i /= 100;
    f %= 100;
    len = 1000; //如果注释此句, 编译会出warning: len 定义了但没使用. 说明下面改变len值得3句没有作用...
    //str = sTmp + "1.03"
    sprintf(str, "%s%s%d.%02d,len=%.5u", s[0], s[1], i, f, len);

    len = sizeof(str); //设断点, len的值没有被改变!!
    len = strlen(str);
    len = strlen(pcc);


    //......
}
[/mw_shl_code]


然后编译,可以通过,无warning。
问题1:软件仿真,设断点在len改变之处,发现 len 的数值无变化。
问题2:同时查看到 strlen() 的 type 怎么是 “void f()” ?? 而 strcat() [string.h] , sprintf() [stdio.h] 功能均正常.


以下是软件仿真截图,个人认为跟软件仿真没关系,这都是C标准库操作,跟硬件基本无关也不会影响硬件什么……求解!
软件仿真 strlen 01 软件仿真 strlen 01

软件仿真 strlen 02 软件仿真 strlen 02

各位帮忙看看哪里不对吗?谢先,必须有请原子兄~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
txapp
1楼-- · 2019-10-16 17:18
len后面没有使用,是否优化掉了?
雷霆万钧
2楼-- · 2019-10-16 20:50
正点原子 发表于 2016-12-23 12:30
很简单的问题,用strlen,如果不能出来,说明你的str可能有问题,用printf,打印出来看看,或者仿真的时候 ...

谢谢原子的回复。

我原文已经用软件仿真试了,我用 str 和 char *pcc 都试了,str内容我初始化成常量也不行,而且尾部是肯定有''的。

所以,我感觉不是代码问题,可能还是环境哪里设置的问题,可找不出来~ 因为没明白为何 sizeof 也有问题??!!

另,len如果注释掉 'len=1000;' 就会抛warning,而不是被优化了。也可以从另外角度理解为被优化了,因为出的warning是说len未被使用,说明len初始化后没再被赋值,进而说明所有可以改变len值得 sizeof,strlen语句全没起作用,但是仿真可以看到它们是被编译过的。

所以,还望有熟悉此问题的仁兄悉心点明一下!
雷霆万钧
3楼-- · 2019-10-16 22:15
我再仿真试试吧,strlen可以自写程序实现(本来我也是想自己写的),但sizeof如果用不了,着实挺难受的……很多数组下标要用到……
或者,我挪到其他位置试试,比如其他函数?

再次谢谢回复仁兄!
雷霆万钧
4楼-- · 2019-10-17 02:56
 精彩回答 2  元偷偷看……

一周热门 更多>