OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6518|回复: 3

困扰了我挺久的一个问题终于得到解决,sizeof什么时候能够获取数组长度?

[复制链接]

7

主题

85

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2013-10-10
在线时间
5 小时
发表于 2015-5-21 23:05:50 | 显示全部楼层 |阅读模式
对于一个任意类型数组长度的获取,可以这样:
#include "stdafx.h"
int main()

    int Array[10];
     printf("%d\n", sizeof(Array) / sizeof(Array[0])); 
    return 0;
}
输出是10。
在获取函数的形参数组长度时,又成了这样:
#include "stdafx.h"

int getSize(int Array[])
{
return sizeof(Array) / sizeof(Array[10]);
}

int main()
{
int Array[10];
printf("%d\n", getSize(Array));
return 0;
}
在这里输出成了1,很奇怪…
经过考证,结论如下:
sizeof的参数是数组名的时候,是可以得到实际的数组所占字节数的。但是在数组作为函数形参传入函数时,数组退化为了指针,所以第二个实验的sizeof(Array)等价于sizeof(&Array[0]),本实验是在windows下运行,所以得到的结果是4字节,最终得到的结果是1。
终于明白为什么在函数的设计中,有的函数的形参一定要给出数组的长度了。
对于这样的动态数组:
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
int main()
{
int* Pointer;
Pointer = (int*)malloc(sizeof(int)* 10);
memset(Pointer, 0, 10);
return 0;
}
我没有想到有什么特别好的办法去获取他的长度。
能不能通过读出越界的数据是个非常大的值这一特征来确定呢?感觉不太靠谱。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-21 23:37:50 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-5-22 08:08:20 | 显示全部楼层
嗯,明白了就能少犯很多错误,C关于指针的问题很多,专讲C与指针的书籍也不少。
回复 支持 反对

使用道具 举报

6

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-4
在线时间
13 小时
发表于 2015-5-24 19:25:21 | 显示全部楼层
应该不行,动态创建估计只有高级语言可以,sizeof是编译的时候就确定了大小,如果想要动态创建数组可以用malloc申请内存 然后用指针访问用完了再释放
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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