1. sizeof与strlen的对比

1.1 sizeof

sizeof属于是操作符,用于计算变量所占的空间大小,单位为字节。如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。

sizeof只计算数据在内存中所占的空间大小,而不在乎内存中存放的数据类型。

例如:

int main()
{int a = 10;printf("%d\n",sizeof a);printf("%d\n", sizeof(a));printf("%d\n", sizeof(int));return 0;
}
4
4
4

1.2 strlen

strlen是C语言库函数,其功能为求字符串长度。函数原型如下:

 size_t strlen ( const char * str );

strlen函数会统计指针str指向的那个地址向后直到字符 '\0' 之前的所有字符个数。

但是,strlen函数会一直向后寻找直到找到 '\0' 为止,所以说有越界访问的可能性。

int main()
{char arr1[] = "abd";char arr2[] = {'a','b','c'};printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));return 0;
}
3
6

这里在创建第二个字符串时没有加上 '\0' ,所以第二行输出的是一个随机结果。像arr1这样创建字符串,编译器会自动在末尾加上一个 '\0' ,所以第一行的输出结果是确定的。

1.3 sizeof 和strlen的对比

sizeof

1.sizeof是操作符

2.sizeof计算操作数所占内存的大小,单位是字节

3.不关注内存中存放什么数据

strlen

1. strlen是库函数,使用需要包含头文件 <string.h>

2.strlen用于求字符串长度,统计字符串中字符 '\0' 之前字符的个数

3.关注内存中是否存在字符 '\0' ,如果不存在,就会一直向后寻找,可能会越界。

2. 数组和指针题目解析

2.1 一维数组

int main()
{int a[] = {1,2,3,4};printf("%d\n",sizeof(a));printf("%d\n",sizeof(a+0));printf("%d\n",sizeof(*a));printf("%d\n",sizeof(a+1));printf("%d\n",sizeof(a[1]));printf("%d\n",sizeof(&a));printf("%d\n",sizeof(*&a));printf("%d\n",sizeof(&a+1));printf("%d\n",sizeof(&a[0]));printf("%d\n",sizeof(&a[0]+1));return 0;
}

下面为解析:

int main()
{int a[] = {1,2,3,4};printf("%d\n",sizeof(a));  //sizeof中a单独出现,表示整个数组,结果为16printf("%d\n",sizeof(a+0));//(a+0),这里a表示数组首元素地址,整体属于整型指针,结果为4/8printf("%d\n",sizeof(*a));//(*a),这里的a表示数组首元素地址,*a表示首元素,类型为整型,结果为4printf("%d\n",sizeof(a+1));//(a+1),a表示数组首元素地址,与整数1相加,整体属于整型指针,结果为4/8printf("%d\n",sizeof(a[1]));//a[1],a表示数组首元素地址,利用操作符[1]来访问数组中下标为1的元素,类型为整型,结果为4printf("%d\n",sizeof(&a));//&a,得到的是整个数组的地址,类型为int(*)[4],结果为4/8printf("%d\n",sizeof(*&a));//(*&a),操作符*与&抵消,最终为a,表示整个数组,结果为16printf("%d\n",sizeof(&a+1));//&a+1,&a得到整个数组地址,+1后跳过整个数组,但是其结果类型依旧为 int(*)[4],结果为4/8printf("%d\n",sizeof(&a[0]));//&a[0],a[0]访问数组中下标为0的元素,即首元素,操作符&得到该元素的地址,类型为整型指针,结果为4/8printf("%d\n",sizeof(&a[0]+1));//&a[0]+1,&a[0]得到数组首元素地址,+1后跳过一个元素,结果类型为整型指针,结果为4/8return 0;
}
16
8
4
8
4
8
16
8
8
8

2.2 字符数组

2.2.1 字符串末尾无 '\0'

代码1:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));//szieof中数组名arr单独出现,表示整个数组,结果为6printf("%d\n", sizeof(arr+0));//arr+0,表示数组首元素地址,类型为字符指针,结果为4/8printf("%d\n", sizeof(*arr));//*arr,arr表示数组首元素地址,*arr表示首元素,类型为字符,结果为1printf("%d\n", sizeof(arr[1]));//arr[1],表示数组中下标为1的元素,类型为字符,结果为1printf("%d\n", sizeof(&arr));//&arr,&arr得到整个数组的地址,类型为 char(*)[6],结果为4/8printf("%d\n", sizeof(&arr+1));//&arr+1,&arr得到整个数组的地址,+1跳过整个数组,但结果类型依旧为为char(*)[6],结果为4/8printf("%d\n", sizeof(&arr[0]+1));//&arr[0]+1,&arr[0]得到首元素的地址,+1后向后跳过一个元素,结果类型为字符指针,结果为4/8return 0;
}
6
8
1
1
8
8
8

代码2:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = {'a','b','c','d','e','f'};printf("%d\n", strlen(arr));//arr表示数组首元素地址,但是数组中没有字符'\0',strlen函数会从arr指向的地址向后一直寻找直到找到'\0',结果为随机值printf("%d\n", strlen(arr+0));//arr表示首元素地址,+0后依旧为首元素地址,结果同第一行结果printf("%d\n", strlen(*arr));//arr为首元素地址,*arr得到首元素字符a,被传递给函数后,a会被转化为其ASCII码值97,并且函数会将97作为地址处理,但是这个地址通常是无法访问的,因此编译时会报错,运行会导致程序崩溃printf("%d\n", strlen(arr[1]));//arr[1],为数组中下标为1的元素,即为b,其结果同第三行printf("%d\n", strlen(&arr));//&arr,&arr得到整个数组的地址,strlen函数会从arr指向的地址向后一直寻找直到找到'\0',结果为随机值printf("%d\n", strlen(&arr+1));//&arr+1,&arr得到整个数组的地址,+1后跳过整个数组,strlen函数向后一直寻找直到找到'\0',结果为随机值    printf("%d\n", strlen(&arr[0]+1));//&arr[0]+1,&arr[0]得到数组首元素的地址,+1跳过一个元素,strlen函数向后一直寻找直到找到'\0',结果为随机值    return 0;
}

将编译错误的语句注释之后得到如下的打印结果:

11
11
11
5
10

2.2.2 字符串末尾存在 '\0'

代码3:

int main()
{char arr[] = "abcdef";printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = "abcdef";//这样创建字符串时,编译器为自动在字符串末尾加上一个'\0'printf("%d\n", sizeof(arr));//sizeof中数组名arr单独出现,表示整个数组,数组中一共有"abcdef"以及末尾的'\0',类型都为字符,因此结果为7//其他的打印不受影响,不过&arr的类型变为了char(*)[7],结果与上面一致,printf("%d\n", sizeof(arr+0));printf("%d\n", sizeof(*arr));printf("%d\n", sizeof(arr[1]));printf("%d\n", sizeof(&arr));printf("%d\n", sizeof(&arr+1));printf("%d\n", sizeof(&arr[0]+1));return 0;
}
7
8
1
1
8
8
8

代码4:

int main()
{char arr[] = "abcdef";printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(*arr));printf("%d\n", strlen(arr[1]));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));return 0;
}

解析:

int main()
{char arr[] = "abcdef";//这样创建字符串,编译器会自动在字符串末尾加上'\0'printf("%d\n", strlen(arr));//arr,arr表示数组首元素,字符串末尾中有'\0',结果为6printf("%d\n", strlen(arr+0));//arr+0,arr表示数组首元素,+0后依旧为数组首元素,字符串末尾中有'\0',结果为6printf("%d\n", strlen(*arr));//编译器报错,原因同代码2printf("%d\n", strlen(arr[1]));//编译器报错,原因同代码2printf("%d\n", strlen(&arr));//&arr,&arr得到整个数组的地址,字符串末尾中有'\0',结果为6printf("%d\n", strlen(&arr+1));//&arr+1,&arr得到整个数组的地址,+1后跳过整个数组,strlen函数向后一直寻找直到找到'\0',结果为随机值printf("%d\n", strlen(&arr[0]+1));//&arr[0]+1,&arr[0]得到数组首元素的地址,+1后跳过一个元素,字符串末尾存在'\0',结果为5return 0;
}

将报错语句注释掉后的打印结果:

6
6
6
5
5

这里,倒数二行的输出结果为5属于是巧合,将字符串中的字符删去两个后,其结果如下:

int main()
{char arr[] = "abcf";printf("%d\n", strlen(arr));printf("%d\n", strlen(arr+0));printf("%d\n", strlen(&arr));printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));return 0;
}
4
4
4
5
3

可以发现,除了倒数第二行打印结果不变外,其余打印结果都发生了变化,并且刚好是原本结果减去2。

2.2.3 用字符型指针存储常量字符串地址

代码5:

int main()
{char *p = "abcdef";printf("%d\n", sizeof(p));printf("%d\n", sizeof(p+1));printf("%d\n", sizeof(*p));printf("%d\n", sizeof(p[0]));printf("%d\n", sizeof(&p));printf("%d\n", sizeof(&p+1));printf("%d\n", sizeof(&p[0]+1));return 0;
}

解析:

int main()
{char *p = "abcdef";//将字符串首字符地址存储在字符型指针p中printf("%d\n", sizeof(p));//p在sizeof中单独使用,表示字符串首字符的地址,类型为字符型指针,结果为4/8printf("%d\n", sizeof(p+1));//p+1,p代表字符串首字符的地址,+1后跳过一个字符,结果类型依旧为字符型指针,结果为4/8printf("%d\n", sizeof(*p));//*p,p为字符串首字符地址,*p得到首字符,即为a,类型为字符,结果为1printf("%d\n", sizeof(p[0]));//p[0],编译器处理p[0]时,转化为*(p+0),结果同第三行printf("%d\n", sizeof(&p));//&p,得到指针p的地址,类型为char**,结果为4/8printf("%d\n", sizeof(&p+1));//&p,得到指针p的地址,+1后跳过一个char**类型的空间大小即跳过指针p的地址,指向存储指针p处地址后的地址,结果类型依旧为char**,结果为4/8printf("%d\n", sizeof(&p[0]+1));//&p[0]+1,转化为&*(p+0)+1,*与&抵消,因此结果为p+1,指向字符中第二个字符处,即为存储字符b的地址,结果类型为char*,结果为4/8return 0;
}
8
8
1
1
8
8
8

代码6:

int main()
{char *p = "abcdef";printf("%d\n", strlen(p));printf("%d\n", strlen(p+1));printf("%d\n", strlen(*p));printf("%d\n", strlen(p[0]));printf("%d\n", strlen(&p));printf("%d\n", strlen(&p+1));printf("%d\n", strlen(&p[0]+1));return 0;
}

解析:

int main()
{char *p = "abcdef";//字符串末尾存在'\0'printf("%d\n", strlen(p));//p为字符串首字符地址,传递给函数strlen,结果为6printf("%d\n", strlen(p+1));//p+1,p为字符串首字符地址,+1后跳过一个字符,传递给函数strlen,结果为5printf("%d\n", strlen(*p));//编译器报错,结果同代码2printf("%d\n", strlen(p[0]));//编译器报错,结果同代码2printf("%d\n", strlen(&p));//&p,&p得到指针p的地址,地址未知,但肯定不与字符串中任意一个字符重叠,传递给函数strlen后,结果为随机值printf("%d\n", strlen(&p+1));//&p,&p得到指针p的地址,+1后地址依旧未知,但肯定不与字符串中任意一个字符重叠,传递给函数strlen后,结果为随机值printf("%d\n", strlen(&p[0]+1));//&p[0]+1,&p[0]得到字符串首字符地址,+1后跳过一个字符,传递给函数strlen,结果为5return 0;
}
6
5
0
5
5

这里的倒数第二行打印结果也属于巧合,可以跳过修改字符串验证:

int main()
{char *p = "abef";printf("%d\n", strlen(p));printf("%d\n", strlen(p+1));printf("%d\n", strlen(&p));printf("%d\n", strlen(&p+1));printf("%d\n", strlen(&p[0]+1));return 0;
}
4
3
0
5
3

2.3 二维数组

代码7:

int main()
{int a[3][4] = {0};printf("%d\n",sizeof(a));printf("%d\n",sizeof(a[0][0]));printf("%d\n",sizeof(a[0]));printf("%d\n",sizeof(a[0]+1));printf("%d\n",sizeof(*(a[0]+1)));printf("%d\n",sizeof(a+1));printf("%d\n",sizeof(*(a+1)));printf("%d\n",sizeof(&a[0]+1));printf("%d\n",sizeof(*(&a[0]+1)));printf("%d\n",sizeof(*a));printf("%d\n",sizeof(a[3]));return 0;
}

解析:

int main()
{int a[3][4] = {0};//创建一个二维数组并将内部元素全部初始化为0printf("%d\n",sizeof(a));//sizeof中数组名a单独出现,表示整个数组,结果为48printf("%d\n",sizeof(a[0][0]));//a[0][0],a[0][0]表示数组中首元素,类型为整型数据,结果为4printf("%d\n",sizeof(a[0]));//二维数组a中,当sizeof中a[0]单独出现,表示数组中的整个第一行,结果为16printf("%d\n",sizeof(a[0]+1));//a[0]+1,此处a[0]表示数组第一行首元素地址,+1后跳过一个元素,最终结果类型为整型指针,打印结果为4/8printf("%d\n",sizeof(*(a[0]+1)));//*(a[0]+1),a[0]+1表示数组中第一行第二个元素的地址,加上*表示该地址处存储的数据,该数据类型为整型,结果为4printf("%d\n",sizeof(a+1));//a+1,a代表二维数组首行的地址,+1后跳过一整行,表示数组中第二行的地址,结果为4/8printf("%d\n",sizeof(*(a+1)));//*(a+1),a+1表示数组中第二行的地址,加上*,得到整个第二行,结果为16printf("%d\n",sizeof(&a[0]+1));//&a[0]+1,&a[0]表示数组中整个第一行的地址,类型为int(*)[4],+1后跳过一整行,但数据类型依旧为int(*)[4],结果为4/8printf("%d\n",sizeof(*(&a[0]+1)));//&a[0]+1,&a[0]表示数组中整个第一行的地址,类型为int(*)[4],+1后跳过一整行,此时指向第二行地址,加上*后,得到整个第二行,结果为16printf("%d\n",sizeof(*a));//*a,a表示二维数组首行的地址,加上*后,表示整个数组首行,结果为16printf("%d\n",sizeof(a[3]));//a[3]表示数组整个第四行,虽然此时属于数组访问越界,但是编译器依旧将其作为数组的行类型处理,结果为16return 0;
}
48
4
16
8
4
8
16
8
16
16
16

数组名的意义:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

3. 除此之外所有的数组名都表示首元素的地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93198.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93198.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93198.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rent8 安装部署教程之 Windows

1. Apache 安装与配置 1.1. 获取并解压 Apache 在 Apache Lounge 网址下载编译版的 Apache。下载完成后&#xff0c;将压缩包解压到 d:\web\Apache24 作为 Apache 的安装目录。 1.2. 配置 Apache 打开配置文件 conf\httpd.conf&#xff0c;找到第 37 行配置。 ​ Define SRVROO…

边缘智能实战手册:攻克IoT应用三大挑战的AI战术

前言&#xff1a;在当前的AIoT&#xff08;人工智能物联网&#xff09;赛道上&#xff0c;将AI能力下沉至边缘设备已不再是“要不要做”的选择题&#xff0c;而是“如何做好”的必答题。然而&#xff0c;在实际项目中&#xff0c;工程师们常常会遇到性能、功耗和隐私这“三座大…

【React】use-immer vs 原生 Hook:谁更胜一筹?

1.概述 use-immer 不属于官方 Hook&#xff0c;是社区维护的第三方库&#xff01;use-immer 通过封装 Immer 的不可变更新机制&#xff0c;为 React 开发者提供了一种更直观、高效的状态管理方式。它尤其适合处理复杂嵌套状态或需要频繁更新的场景&#xff0c;同时保持了与 Re…

【案例】Vue3 实现高性能级横向循环滚动生产线效果:基于 requestAnimationFrame 的流畅动画方案

动画效果在工业监控系统、生产看板等场景中&#xff0c;经常需要模拟生产线的动态运行效果。本文将基于 Vue3 和 requestAnimationFrame 实现一个高性能的横向循环滚动效果&#xff0c;完美模拟生产线传输带的视觉体验。我们将从代码实现到原理分析&#xff0c;全面讲解如何打造…

万字长文解码如何玩转Prompt(附实践应用)

在AI技术迅猛发展的今天&#xff0c;如何与大型语言模型高效“对话”已成为释放其潜力的关键。本文深入探讨了提示词工程&#xff08;Prompt Engineering&#xff09;这一新兴领域&#xff0c;系统解析了从基础概念到高级技巧的完整知识体系&#xff0c;并结合“淘宝XX业务数科…

easyExcel嵌套子集合导出Excel

我想要的Excel效果说明: 1.创建两个自定义注解:ExcelMerge(表示主对象内的单个属性,后续会根据子集合的大小合并下面的单元格),ExcelNestedList(表示嵌套的子集合) 2.NestedDataConverter.java 会把查询到的数据转换为一行一行的,相当于主表 left join 子表 ON 主.id子.主id的形…

基于 C# WinForm 字体编辑器开发记录:从基础到进阶

目录 基础版本实现 进阶版本改进 字体设置窗体增强 主窗体改进 功能对比 项目在本文章的绑定资源中免费的&#xff0c;0积分就可以下载哦~ 在 Windows Forms 应用开发中&#xff0c;字体编辑功能是许多文本处理软件的基础功能。本文将分享一个简易字体编辑器的开发过程&a…

Linux基本使用和Java程序部署(含 JDK 与 MySQL)

文章目录Linux 背景知识Linux 基本使用Linux 常用的特殊符号和操作符Linux 常用命令文本处理与分析系统管理与操作用户与权限管理文件/目录操作与内容处理工具Linux系统防火墙Shell 脚本与实践搭建 Java 部署环境apt&#xff08;Debian/Ubuntu 系的包管理利器&#xff09;介绍安…

抗辐照CANFD通信芯片在高安全领域国产化替代的研究

摘要&#xff1a;随着现代科技的飞速发展&#xff0c;高安全领域如航空航天、卫星通信等对电子设备的可靠性与抗辐照性能提出了极高的要求。CANFD通信芯片作为数据传输的关键组件&#xff0c;其性能优劣直接关系到整个系统的稳定性与安全性。本文聚焦于抗辐照CANFD通信芯片在高…

Mybatis 源码解读-SqlSession 会话源码和Executor SQL操作执行器源码

作者源码阅读笔记主要采用金山云文档记录的&#xff0c;所有的交互图和代码阅读笔记都是记录在云文档里面&#xff0c;本平台的文档编辑实在不方便&#xff0c;会导致我梳理的交互图和文档失去原来的格式&#xff0c;所以整理在文档里面&#xff0c;供大家阅读交流. 【金山文档…

Java集合类综合练习题

代码 import java.util.*; class ScoreRecord {private String studentId;private String name;private String subject;private int score;public ScoreRecord(String studentId, String name, String subject, int score) {this.studentId studentId;this.name name;this.s…

秒懂边缘云|1分钟了解边缘安全加速 ESA

普通开发者如何搭建安全快速的在线业务才能性价比最高 &#xff1f;阿里云现已为开发者推出免费版边缘安全加速 ESA&#xff0c;1 个产品就能把 CDN 缓存 API 加速 DNS WAF DDoS 防护全部搞定&#xff0c;还支持边缘函数快速部署网站和 AI 应用&#xff0c;性价比拉满。 1…

数据结构:串、数组与广义表

&#x1f4cc;目录&#x1f524; 一&#xff0c;串的定义&#x1f330; 二&#xff0c;案例引入场景1&#xff1a;文本编辑器中的查找替换场景2&#xff1a;用户手机号验证&#x1f4da; 三&#xff0c;串的类型定义、存储结构及其运算&#xff08;一&#xff09;串的抽象类型定…

服务器路由相关配置Linux和Windows

服务器路由相关配置Linux和Windowscentos路由系统核心概念传统工具集(命令)iproute2 工具集&#xff08;推荐&#xff09;NetworkManager 工具路由配置文件体系高级路由功能策略路由多路径路由路由监控工具系统级路由配置启用IP转发路由守护进程路由问题诊断流程Windows 路由Wi…

Spring Boot启动事件详解:类型、监听与实战应用

1. Spring Boot启动事件概述1.1 什么是Spring Boot启动事件在Spring Boot的应用生命周期中&#xff0c;从main方法执行到应用完全就绪&#xff0c;期间会发生一系列事件&#xff08;Event&#xff09;。这些事件由Spring Boot框架在特定时间点触发&#xff0c;用于通知系统当前…

Python闭包详解:理解闭包与可变类型和不可变类型的关系

一、定义闭包&#xff08;Closure&#xff09; 指的是一个函数对象&#xff0c;即使其外部作用域的变量已经不存在了&#xff0c;仍然能访问这些变量。简单来说&#xff0c;闭包是由函数及其相关的环境变量组成的实体。def outer():x 10def inner():print(x)return innerf ou…

BotCash:GPT-5发布观察 工程优化的进步,还是技术突破的瓶颈?

BotCash&#xff1a;GPT-5发布观察 工程优化的进步&#xff0c;还是技术突破的瓶颈&#xff1f; 在GPT-4以多模态能力震撼业界的一年后&#xff0c;GPT-5的亮相显得有些“平静”。当人们期待着又一场颠覆性技术革命时&#xff0c;这场发布会更像是给大模型技术按下了“精细打磨…

AJAX学习(2)

目录 一.XMLHttpRequest 二.XMLHttpRequest——查询参数 三.案例——地区查询 四.XMLHttpRequest_数据提交 五.Promise 六.Promise三种状态 七.PromiseeeXHR获取省份列表&#xff08;案例&#xff09; 八.封装-简易axios-获取省份列表 九.封装-简易axios-获取地区列表 …

解决 pip 安装包时出现的 ReadTimeoutError 方法 1: 临时使用镜像源(单次安装)

解决 pip 安装包时出现的 ReadTimeoutError 当您在使用 pip 安装 Python 包时遇到 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out. 错误时&#xff0c;这通常是由于网络问题导致的连接超时。P…

Linux下使用Samba 客户端访问 Samba 服务器的配置(Ubuntu Debian)

在 Linux 系统中&#xff0c;Samba 提供了与 Windows 系统文件共享的便利方式。本文将详细介绍在 Ubuntu 和 Debian 系统下如何安装 Samba 客户端、访问共享资源&#xff0c;并实现远程目录挂载和开机自动挂载。 文章参考自&#xff08;感谢分享&#xff09;&#xff1a;https…