一、 C语言中计算数组长度大小

C语言字符串长度的计算可以使用strlen(str); 但是对于数组长度的大小却没有相关函数可以使用;
C语言数组长度的大小可以使用:

int main()
{int arr[] = {1,2,3,4,5};int length = sizeof(arr)/sizeof(int);printf("the length of arr is %d\n", length);
}

二、 在函数调用中计算数组的长度

上述计算数组长度的方法在函数调用中不可使用,有bug;
考虑下面代码:

#include <stdio.h>void test(int *arr){int length = 0;length = sizeof(arr)/sizeof(int);printf("test: array sizees %d\n", sizeof(arr));printf("test: array length %d\n", length);
}int main()
{int arr[] = {1,2,3,4,5,6,7,8,9};int length = 0;  length = sizeof(arr)/sizeof(int);test(arr);printf("main: array sizees %d\n", sizeof(arr));printf("main: length of array %d\n", length);
}

其结果是:

造成上述结果的原因是:
主函数中,正确计算得到数组长度是9,并且数组内存大小是36字节,因为这时候arr是数组首元素,sizeof(arr) 计算得到的是一整段连续内存空间的大小,即36字节;
子函数中, 由于主函数中的数组首元素经过函数参数传递给子函数, 将实参赋值给形参的过程中,数组首元素转化为一个整型指针,所以子函数中sizeof(arr)得到的是一个指针内存大小。博主电脑是64位,而整型int大小是4位,最后得到数组长度是2;

三、 在子函数中得到主函数中数组长度的方法

建议方法是在传递数组首地址的时候,一同将数组长度也传递过去

#include <stdio.h>
void test(int arr[], int length)
{for(int i = 0; i < length; i++)printf("%d, ", arr[i]);printf("\n");
}int main()
{int arr[] = {1,2,3,4,5,6,7,8,9};int length = sizeof(arr)/sizeof(int);test(arr, length);
}

四、 将数组和数组长度传递给子函数对于数列是可行的,但是对于二维数组(即表),会产生Segmentation fault(core dump)错误;

#include <stdio.h>
#include <stdlib.h>
void test(int **arr, int n)
{for(int i = 0; i < n; i++)arr[i][i] = 0;
}int main()
{int n = 6;int arr[n][n];for(int i = 0; i < n; i++)arr[i][i] = 0;test(arr, n);
}

原因分析:主函数中,将二维数组都赋值为0;可以实现;
子函数中, 将二维数组赋值为0,失败;经过分析,子函数中一旦出现arr[i][i] 语句就会失败; 本人猜测的原因在于,arr在主函数中是数组首地址, arr在子函数中就是一个单纯的指针。 C语言内部有实现arr[i][j]计算的机制,即&arr[i][j] = &arr + sizeof(arr[i]) *i + sizeof(int) *j; 由于arr只是一个单纯的指针,这个计算机制失效;(具体的原因细节没有找到资料,望广大网友提供)

其他解决办法:
1) 在子函数test中,函数声明变成如下所示,编译不会出错

void test(int arr[][n], int n)

2) 将arr声明为全局变量, 也不会有编译出错
3) 即将arr声明为全局变量, 又使用int [][n], 也会出现意想不到的错误;

五、 解决子函数中使用二维数组的办法

对于第4点,可以使用下面代码实现在子函数中对二维数组元素的访问, 避免了使用arr[i][j]计算机制;

#include <stdio.h>
#include <stdlib.h>
void test(int **arr, int n)
{for(int i = 0; i < n; i++)*((int *)arr + n*i +i) = 0; //arr[i][i] = 0;
}int main()
{int n = 6;int arr[n][n];for(int i = 0; i < n; i++)arr[i][i] = 0;test(arr, n);
}

六、 C++中,在子函数中对二维数组对角线赋值应注意初始化

使用vector数组的时候,如果使用下标arr[][], 一定要注意下标越界,因为vector并不进行下标越界检查;

#include <iostream>
#include <vector>using namespace std;void test(vector <vector<int>> & arr) {for (int i = 1; i < arr.size(); i++)arr[i][i] = 1;
}int main()
{int n = 6;vector<vector<int>> arr;    //编译无误,因为arr.size() == 0;arr[i][i]没有执行//编译有误,元素vector<int> 没有初始化,使用m[i][i]出错vector<vector<int>> arr(n);    vector<vector<int>> arr(n, vector<int>(n));   //编译无误test(arr);return 0;
}

C语言中数组长度的计算详解相关推荐

  1. c语言中数组长度的计算

    c语言中数组长度的计算 一维数组 计算数组的长度:       sizeof(数组名):得到这个数组占用内存的总长度       公式: sizeof(数组名) / sizeof(数组类型); 二维数 ...

  2. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

  3. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

  4. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  5. Python中数组切片的用法详解

    Python中数组切片的用法详解 一.python中"::-1"代表什么? 二.python中":"的用法 三.python中数组切片 三.numpy中的整数数 ...

  6. C语言中三个数比较大小详解——三种方法

    ​ C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...

  7. c语言自定义color,forecolor c语言中的颜色设置语句详解

    backcolor与forecolor的区别 backcolor:用来设置图像的背景颜色,也用来设置文档.表格.图像等的背景颜色. forecolor:用来设置图像的前景颜色,也用来设置文档.表格.图 ...

  8. c语言输入循环语句,C语言中输入输出和循环语句详解.ppt

    C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...

  9. C语言中数组长度的计算方法总结(sizeof与strlen)

    最近在重新学习C语言,学习中发现之前对数组长度的计算方法模糊不清.因此做个总结. 首先要明白什么是数组. 数组是一组相同类型元素的集合. 因此,要定义一个数组,首先要确定数组内的元素是同一种类型. 1 ...

最新文章

  1. linux shell执行方式
  2. 钢铁侠机器人公仔_这个618,买个钢铁侠机器人和儿子一起回童年
  3. 对Xcode菜单选项的详细探索
  4. python 跳过计算错误_在python中计算分数时如何跳过被0除的错误?
  5. Latex+Texstudio+Texlive 2020 windows10 安装教程
  6. 麒麟操作系统|Linux下低延时RTMP|RTSP直播播放实现
  7. rcp异步多参数实例
  8. Javascript特效:tab标签
  9. kubernetes集群搭建(二进制方式)
  10. 使用linux批量引物设计,【分享】超实用的引物设计操作,一看就学会
  11. java检查文件的编码格式
  12. 沪牌每月价格预测模型
  13. 龙兵智能名片多企业小程序V2.3.3-开源版
  14. Android8怎么格式化内存卡,安卓手机内存卡无法格式化怎么办【解方法决】
  15. 多账号统一登陆,账号模块的系统设计
  16. 使用Crucible和FishEye链接svn库时遇到尝试添加或索引存储库时出现错误-版本中不存在的问题
  17. 计算机硬盘从盘的设置,图文解说:电脑硬盘的主从盘设置方法_清风一笑
  18. 前端维护项目该怎么做呢
  19. AD19 网络标签 无法连接
  20. 回声问题和回声消除技术及在可视监控对讲、楼宇对讲等领域的应用综述

热门文章

  1. 名帖169 李邕 行书《云麾将军碑》
  2. 工行支付之加工需要提交的数据和签名
  3. 终于有人把OpenCV、人脸识别与深度学习讲明白了
  4. 《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86
  5. 在线辅导平台,兼职赚钱,分享知识变现
  6. 《出版专业基础》2015年版(初级)思考与练习 第四章
  7. Delphi代码注册Midas.DLL
  8. 基于深度学习的图像分割
  9. CD20嵌合单克隆抗体丨Cayman Chemical方案
  10. 模板方法模式应用小记