// 这是一篇导入进来的旧博客,可能有时效性问题。

程序中,当我们建立了一个int型数组:
int a[]={1,2,3,4,5,6};
随后我们可能需要知道它的长度,此时可以用这种方法:
length = sizeof(a)/sizeof(a[0]);

这种方法很实用,但是能不能用一个自定义函数接收一个数组作为参数,求其长度呢?
直觉上,我们可能会写出这样的程序:

#include<stdio.h>
int len(int a[])
{
int len = sizeof(a)/sizeof(a[0]);
return len;
}
int main()
{
int a[]={11,12,13,14,15,16};
printf("%d\n", len(a));
return 0;
}
但是很快我们就会发现结果是错误的。仔细分析会发现,在len(int a[])函数中,sizeof(a)的结果实际上是a指针的长度(在我的系统中长度是8),而不是整个数组a的长度。
这是由于,当把数组作为参数传递时,数组退化为了指针,因此不再能得到数组长度

我在网上看到了有人说用一种指针的方法可以做到在函数中求数组参数的长度,我把他的代码稍作修改便于观察调试,如下:

#include<stdio.h>
int len(int a[])
{
int len = 0;
int *p;
p = a;
 
while((*p)!=NULL)
{
printf("current pointer: %d\n", p);
printf("current value: %d\n", *p);
p++;
len++;
}
 
printf("current pointer: %d\n", p);
printf("current value: %d\n\n", *p);
 
return len;
}
int main()
{
int a[]={11,12,13,14,15,16};
        printf("actual length: %d\n\n", sizeof(a)/sizeof(a[0]));
printf("length: %d\n",len(a));
return 0;
}
在我的系统中,某次运行结果是这样的:


分析程序和结果,首先我们知道这种方法是错误的(结果有时是正确的有时是错误的,图中是错误的结果)。
其次,我们看到,当对指针p进行自加一操作,p确实会诚实地指向下一元素的地址(本例中是地址自加4,即int长度)。
最后,程序中用(*p)!=NULL作为判断条件,判断是否已经超过数组范围,这一操作是危险的,因为它产生了数组越界,而这在C语言中得不到警告。程序越界访问了不可预测的地址内容,在10485320处得到了一个不可预测的值1,并把它也算作数组中的一个元素。在下一个地址也就是10485324处,值为0,看作了NULL,数组结束。

结论: C语言中,把数组作为参数传递,接收数组的函数无法确定这个数组的长度。解决办法是,在传递数组的时候,把数组的长度作为单独的参数传递,或是把数组长度作为全局变量,这样传递的数组才是可用的。

C陷阱:求数组长度的更多相关文章

  1. C++ 数组长度 以及 数组名作为参数传递给函数 以及 为什么不在子函数中求数组长度

    在看排序,首先是插入排序,思路理清后想用代码实现,然后问题来了: 如何求数组长度? 如果没记错,在Java中应该是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有 ...

  2. strlen()和sizeof()求数组长度

    在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...

  3. c语言求数组长度

    在定义数组的函数内 int arr[] = {12.12}; int length; length = ]; 在别的函数中作为引用数据类型引入时,以上方法失效: 解决方法1:再传一个int 类型的长度 ...

  4. c++中求数组长度

    #include <iostream> using namespace std; template <class T> int getArrSize(T& arr){ ...

  5. 求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...

  7. 求字符串长度 strlen(数组指针两种方式)

    问题: 求字符串中所含有字符的个数(包括空格),即求字符串长度: #include <stdio.h> #include <assert.h> int _strlen(cons ...

  8. 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

    一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...

  9. 求数组中的最小子数组,时间复杂度o(n),java

    石家庄铁道大学 信1405-1 班 唐炳辉 题目:给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 设计思路:两个变量 ,一个记录当前并入的数组的值,另外一个记录所算过得最大的数组的值,当 ...

随机推荐

  1. Centos7安装配置Xhgui

    XhProf是Facebook出品的一个PHP性能监控工具,只包含基本的界面和图形来分析数据.后来Paul Reinheimer在此基础上开发了Xhgui,提供了更好的界面和功能,其主页在https: ...

  2. git的merge功能

    merge功能是将一些分支的内容合并到某一个特定的分支,这里我为了测试下,在阿里云code上面新建了一个项目 现在我需要将dev分支merge到主分支master 开发者和管理员都有权发起merge请 ...

  3. 【python】局部变量和全局变量

  4. Scrapy爬虫实例——校花网

    学习爬虫有一段时间了,今天使用Scrapy框架将校花网的图片爬取到本地.Scrapy爬虫框架相对于使用requests库进行网页的爬取,拥有更高的性能. Scrapy官方定义:Scrapy是用于抓取网 ...

  5. Python 集体智慧编程PDF

    集体智慧编程PDF 1.图书思维导图http://www.pythoner.com/183.html p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12. ...

  6. iOS Swift--UIImageView UIImage

    1.UIImageView + UIImage    Demo import UIKit class UIImageViewViewController: UIViewController { var ...

  7. XMPP协议的基本理解

    即时通讯技术简介 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容.大多数常用的即时通讯发送程序都会提 ...

  8. Python学习日记:day8-------文件操作

    文件操作 1,文件路径:d:\xxxx.txt     绝对路径:从根目录到最后     相对路径:当前目录下的文件 2,编码方式:utf-8 3,操作方式:只读,只写,追加,读写,写读...... ...

  9. C++各种指针辨析

    1)int *p p与*结合,表明p是一个指针 然后前面int说明p是一个整形的指针 2)int *p[n] 因为[]比*优先级高,所以p先与[]结合,表明p是个数组,然后这个数组在与*结合,说明数组 ...

  10. Linux下添加源的几种方法

    sudo add-apt-repository  xxxxxxx sudo gedit /etc/apt/sources.list然后把源粘贴进去,保存,最后shell输入sudo apt-get u ...