搜索
bottom↓
回复: 36

stm32 sizeof如何求数组长度

[复制链接]

出0入0汤圆

发表于 2013-4-29 13:35:47 | 显示全部楼层 |阅读模式
u8 i;
u8 a[]={"fkdjfjfkjg jkg  dfj  dslfj "};
for(i=0;i<sizeof(a);i++)
{
lcd_write_byte(dat[i]);
}

这样显示的内容长度和实际不一致,为啥?

出0入0汤圆

发表于 2013-4-29 14:09:00 | 显示全部楼层
你这样不如去判断 a[x]!=0  就输出;

出0入0汤圆

 楼主| 发表于 2013-4-29 14:30:29 | 显示全部楼层
jcrorxp 发表于 2013-4-29 14:09
你这样不如去判断 a[x]!=0  就输出;

  要是数组是十六进制,就有可能中间值是0x00,它和'\0'的十六进制是一致的,这样就不好处理了

出0入0汤圆

发表于 2013-4-29 14:52:32 | 显示全部楼层
1.数组长度这么判断 #define array_sizeof(a) (sizeof(a) / sizeof(a[0]))
2.数组初值是 u8 a[] = "fkdjfjfkjg jkg  dfj  dslfj ";
如果u8 a[]={"fkdjfjfkjg jkg  dfj  dslfj "};这样的话...数组中有4个元素...
即"fkdjfjfkjg jkg  dfj  dslfj "的32位内存地址void*的4个char...应该只输出4个吧
   

出0入0汤圆

发表于 2013-4-29 15:16:48 | 显示全部楼层
字符串应该用strlen(a);

出0入0汤圆

 楼主| 发表于 2013-4-29 15:34:21 | 显示全部楼层
mhw 发表于 2013-4-29 15:16
字符串应该用strlen(a);

stm32固件库好像没有strlen()吧?而且碰到0x00一样会出问题

出0入0汤圆

 楼主| 发表于 2013-4-29 15:37:54 | 显示全部楼层
adce 发表于 2013-4-29 14:52
1.数组长度这么判断 #define array_sizeof(a) (sizeof(a) / sizeof(a[0]))
2.数组初值是 u8 a[] = "fkdjfjf ...

a数组咋只有四个元素呢?
"fkdjfjfkjg jkg  dfj  dslfj "的32位内存地址void*的4个char,这句也不懂,请指教

出0入0汤圆

发表于 2013-4-29 15:49:17 | 显示全部楼层
limi000005 发表于 2013-4-29 15:37
a数组咋只有四个元素呢?
"fkdjfjfkjg jkg  dfj  dslfj "的32位内存地址void*的4个char,这句也不懂,请 ...

第二条我说的好像不对....

另外dat 是啥....sizeof(a)是28么?

出0入0汤圆

 楼主| 发表于 2013-4-29 15:55:32 | 显示全部楼层
adce 发表于 2013-4-29 15:49
第二条我说的好像不对....

另外dat 是啥....sizeof(a)是28么?

dat 就是a数组,不好意思,sizeof(a)是4

出0入0汤圆

发表于 2013-4-29 16:25:16 来自手机 | 显示全部楼层
把0x00放到双引号里怎么可能?

出0入0汤圆

 楼主| 发表于 2013-4-29 16:31:48 | 显示全部楼层
wxty 发表于 2013-4-29 16:25
把0x00放到双引号里怎么可能?

不放在引号里,假设有这么一个数组含0x00,不是说要把0x00放在引号里

出0入0汤圆

发表于 2013-4-29 17:09:16 | 显示全部楼层
limi000005 发表于 2013-4-29 15:34
stm32固件库好像没有strlen()吧?而且碰到0x00一样会出问题

任何C库都有strlen()
在C源码开头包含头文件即可:
#include <string.h>

出0入93汤圆

发表于 2013-4-29 17:21:50 | 显示全部楼层
如果你的sizeof(a)不是28,那么建议更换编译器,这样的编译器绝对坑爹。你的sizeof(a)=4显然是将a当做字符串了,但是数组和指针是完全不同的,数组直接分配到栈上,指针指向的内容是分配在堆上的。
另外,你的sizeof(a)中的a和u8 a[]={"fkdjfjfkjg jkg  dfj  dslfj "};中的a是同一个a吗,也就是说,你有没有可能sizeof(a)中的a采用了extern u8* a;这样的语句重新声明。

出0入0汤圆

发表于 2013-4-29 17:23:38 | 显示全部楼层
sizeof(a)/sizeof(char)

出0入0汤圆

发表于 2013-4-29 17:36:38 | 显示全部楼层
c382671878 发表于 2013-4-29 17:23
sizeof(a)/sizeof(char)

+1 字节补丁

出0入0汤圆

发表于 2013-4-29 18:27:04 | 显示全部楼层
#define countof(a)      (sizeof(a) / sizeof(*(a)))           a就是你的数组名        用库的话好像得勾上  Use MicroLIB

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-29 18:40:34 来自手机 | 显示全部楼层
要么char xxx[]="abcdefg",要么char xxx[]={'a','b','c',}

获取数组元素个数用sizeof (xxx)/sizeof(xxx[0])

出0入0汤圆

发表于 2013-4-29 20:56:43 | 显示全部楼层
limi000005 发表于 2013-4-29 15:55
dat 就是a数组,不好意思,sizeof(a)是4

如果是4 就是我说的第二条那种了....

u8 a[]={"fkdjfjfkjg jkg  dfj  dslfj "};
实际上只有一个元素....这个元素是 "fkdjfjfkjg jkg  dfj  dslfj " 的首地址 即 char* pstr;
char* pstr是一个void*类型的指针...占4个字节...
所以a的大小就是4...

其实大部分编译器都编译为28...

出0入8汤圆

发表于 2013-4-29 21:44:52 来自手机 | 显示全部楼层
判断为o,或者strlen

出0入0汤圆

发表于 2013-4-29 21:54:09 | 显示全部楼层
看到头晕啊!!

出0入0汤圆

 楼主| 发表于 2013-4-29 22:02:30 | 显示全部楼层
adce 发表于 2013-4-29 20:56
如果是4 就是我说的第二条那种了....

u8 a[]={"fkdjfjfkjg jkg  dfj  dslfj "};

不太明白,char* pstr咋来的?

出0入0汤圆

 楼主| 发表于 2013-4-29 22:06:37 | 显示全部楼层
takashiki 发表于 2013-4-29 17:21
如果你的sizeof(a)不是28,那么建议更换编译器,这样的编译器绝对坑爹。你的sizeof(a)=4显然是将a当做字符 ...

sizeof(a)和a[]={};一致。
没有用sizeof(a)中的a采用了extern u8* a;这样的语句重新声明

出0入0汤圆

 楼主| 发表于 2013-4-29 22:10:34 | 显示全部楼层
onev 发表于 2013-4-29 18:27
#define countof(a)      (sizeof(a) / sizeof(*(a)))           a就是你的数组名        用库的话好像得勾 ...

我用的IAR环境,要是IAR应该如何设计呢

出0入0汤圆

 楼主| 发表于 2013-4-29 22:19:03 | 显示全部楼层
lllaaa 发表于 2013-4-29 18:40
要么char xxx[]="abcdefg",要么char xxx[]={'a','b','c',}

获取数组元素个数用sizeof (xxx)/sizeof(xxx[0] ...

这两者都不行,我用的是IAR

出0入0汤圆

发表于 2013-4-29 22:40:58 | 显示全部楼层
limi000005 发表于 2013-4-29 22:19
这两者都不行,我用的是IAR

你在顶楼的写法就是声明了个一个指针数组,里面元素只有一个指向字符串的指针。所以我写的那两个才是你要的

出0入0汤圆

 楼主| 发表于 2013-4-29 23:18:57 | 显示全部楼层
lllaaa 发表于 2013-4-29 22:40
你在顶楼的写法就是声明了个一个指针数组,里面元素只有一个指向字符串的指针。所以我写的那两个才是你要 ...

char xxx[]="abcdefg"
这种不行哦,我刚试过

出0入0汤圆

发表于 2013-4-30 01:03:11 | 显示全部楼层
标准c语法,不可能不行的。贴文件和报错信息

出0入0汤圆

发表于 2013-4-30 07:44:05 来自手机 | 显示全部楼层
你的显示函数有问题没,有没有限制?

出0入0汤圆

 楼主| 发表于 2013-4-30 09:04:12 | 显示全部楼层
photon544 发表于 2013-4-30 07:44
你的显示函数有问题没,有没有限制?

没有限制,本打算就是把数组里字符串全部显示出来

出0入0汤圆

发表于 2013-4-30 09:22:49 | 显示全部楼层
我用的是IAR,得到的是28。。。。。。

出0入0汤圆

发表于 2013-4-30 09:23:51 | 显示全部楼层
你的写法应该没什么问题。可能是编译器的差异。。。。。。。要不要考虑换一个?

出0入0汤圆

 楼主| 发表于 2013-5-1 19:15:23 | 显示全部楼层
usk5yenj4id04dm 发表于 2013-4-30 09:23
你的写法应该没什么问题。可能是编译器的差异。。。。。。。要不要考虑换一个? ...

好吧,哪天试一下

出0入0汤圆

发表于 2021-6-21 09:11:29 | 显示全部楼层
我在用keil开发stm32也是sizeof出现问题超出153的长度的数组就不行了

出105入79汤圆

发表于 2021-6-22 02:05:54 | 显示全部楼层
数组的sizeof值等于数组所占用的内存字节数。 得到4绝对有问题。

出0入162汤圆

发表于 2021-6-22 08:01:55 来自手机 | 显示全部楼层
qwe2231695 发表于 2021-6-22 02:05
数组的sizeof值等于数组所占用的内存字节数。 得到4绝对有问题。

a是指针
Sizeof自然就是4字节,指针占4字节

出0入18汤圆

发表于 2021-6-22 08:20:10 来自手机 | 显示全部楼层
AWEN2000 发表于 2021-6-22 08:01
a是指针
Sizeof自然就是4字节,指针占4字节

正解。      

出105入79汤圆

发表于 2021-6-22 09:47:47 | 显示全部楼层
AWEN2000 发表于 2021-6-22 08:01
a是指针
Sizeof自然就是4字节,指针占4字节

数组名只有作为函数参数时才是退化为指针使用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 11:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表